1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C-指针 二级指针 二维数组作为函数参数使用 C语言链表(详解)

C-指针 二级指针 二维数组作为函数参数使用 C语言链表(详解)

时间:2022-08-07 06:53:19

相关推荐

C-指针 二级指针 二维数组作为函数参数使用 C语言链表(详解)

一级指针

int *p; //表示定义一个int型(4字节)的指针p&p //表示p自身的地址位置p //表示p指向的地址位置(也就是p变量的值)*p //表示p指向的地址里面的内容

所以 * 的作用:p变量的值作为地址,去访问这个地址的内容

二级指针

int **pp //表示定义一个int *型的指针pp&pp //表示pp自身的地址位置pp //表示pp指向的地址, 比如pp=&p,注意pp是int *x型,所以指向其它类型地址将会报错,*pp //表示pp指向的地址上的内容, 比如pp=&p,则*pp将去访问&p地址的内容.**pp //表示将pp指向的地址上的内容作为地址,去访问这个地址的内容, *pp=*(*pp)=*p

例如:

int main(){int i=5; //假设 &i =0x100int *p=&i; //假设 &p =0x500int **pp=&p; //假设 &pp=0x1000/*所以 &i=0x100,i=5&p=0x500 p =0x100 *p=5&pp=0x1000 pp=0x500 *pp=0x100 **pp=5 */}

二级指针与二维数组使用参考:/fengxinlinux/article/details/51541003

如果想将二维数组作为函数参数使用,可以这样写:

#include <stdio.h>void func(int arrs[][2]){arrs[0][2]=100;}int main(){int arrs[8][2];func(arrs);printf("arrs[0][2]=%d\n",arrs[0][2]);return 0;}

链表

首先讲讲malloc和free:

在添加链表和释放链表时需要用到,避免内容被自动释放

void *malloc(int size);

malloc返回值是void *类型,所以需要用指针获取,且还需要强制转换.

void free(void *ptr);

释放地址,和malloc搭配使用,例如:

char *p;char str[]="ABCD";p= (char *)malloc(strlen(str));//必须使用指针获取,并强制转换strcpy(p,str);... ...free(p);

双向链表实例如下:

#include "stdio.h"#include <stdlib.h>#include "string.h"typedef struct NAME{char *name;struct NAME *preced; //上个name链表成员struct NAME *next;//下个name链表成员}T_NAME, *PT_NAME;PT_NAME g_ptNameListHead=NULL; //链表头void add_LinkList(PT_NAME nameNew){PT_NAME ptTamp;int i=0;

if(g_ptNameListHead==NULL)//第一次添加链表{g_ptNameListHead= nameNew;return ;}else{ptTamp=g_ptNameListHead;while(ptTamp->next)//下个链表成员是否为空{ptTamp=ptTamp->next;}ptTamp->next=nameNew; //添加下个链表成员nameNew-> preced= ptTamp; //在下个链表成员里添加上个链表 return ; }}void add_name(char str[]){PT_NAME ptTamp;char *p; p=(char *)malloc(strlen(str));strcpy(p,str);ptTamp=(PT_NAME)malloc(sizeof(T_NAME));ptTamp->name=p;ptTamp-> preced=NULL;ptTamp-> next= NULL;add_LinkList(ptTamp); //添加链表}/*从链表里找到name位置*/PT_NAME find_name(char str[]){PT_NAME ptTamp;if(g_ptNameListHead==NULL)return NULL;

ptTamp=g_ptNameListHead;while(ptTamp){if(strcmp(ptTamp->name,str)==0) //find{return ptTamp;}elseptTamp=ptTamp->next;}return NULL;}int del_name(char str[]){PT_NAME ptTamp;PT_NAME ptLast;PT_NAME ptNext;

ptTamp=find_name(str);if(!ptTamp)return -1;if(ptTamp==g_ptNameListHead) //若去掉的是链表头{g_ptNameListHead=ptTamp->next; //指向下个链表成员}else{/*获取上个链表成员和下个链表成员*/ptLast=ptTamp->preced;ptNext=ptTamp->next ;/*去掉当前链表成员*/ptLast->next= ptNext;ptNext->preced=ptLast;}free(ptTamp->name);free(ptTamp);return 0;}void List_name(void){int i=0;PT_NAME ptTamp=g_ptNameListHead;while(ptTamp){printf("<%d> %s\n",i,ptTamp->name); ptTamp=ptTamp->next;}}void scanf_name(char cmd){char name[128];switch(cmd){case 'a'://add{printf("please enter name:\n");scanf("%s",name);add_name(name);printf("add %s OK\n",name);break;}case 'd'://del{printf("please enter name:\n");scanf("%s",name);if(del_name(name)<0){printf("del %s error\n",name);}elseprintf("del %s OK\n",name);break;}case 'l'://listList_name(); break;} }int main(int argc, char **argv){char c;while(1){printf("**********************\n");printf("<l> List all the names\n");printf("<a> add one name\n");printf("<d> del one name\n");printf("<q> quit\n");printf("**********************\n");do{scanf("%c",&c);}while(c!='a'&&c!='d'&&c!='q'&&c!='l'); switch(c){case 'a':case 'l':case 'd':scanf_name(c); break;case 'q':return 0;default : break;}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。