指向指针的指针的指针变量 **p,和指针变量之间的赋值. //例1。 1 ints(char **a) 2 { 3 char *b; 4 b = (char *)malloc(sizeof(char)); 5 *b = 'a'; 6 *a = b; 7 //a = &b; 8 } 9 main() 10 { 11 char *m; 12 ints(&m); 13 printf("%c/n",*m); 14 free(b); 15 } 上例是一个简单的分配内存后赋值的例子,编译运行后打印出a字符,如把第6行注释后把第7行的注释取消,编译运行后打印出的是空。 再看一个例子 //例2 1 main() 2 { 3 char *b; 4 char **a; 5 b = (char *)malloc(sizeof(char)); 6 *b = 'a'; 7 *a = b; 8 //a = &b; 9 printf("%c/n",**a); 10 free(b); 11 } 这个例子和上面的例子差不多,但是无论用*a =b ;编译还是用a = &b;编译都会打印出a 字符。 编译器不报错说明例1、例2的语法都没有问题,但为什么例1中的7为什么打不出a字符?区别在哪?我们来分析一下例1, 句子都很简单容易明白,我们主要来看下出现问题的两句,6句中,b为指针变量,它指向一块新分配的内存,该内存的内容为'a' ,而b的值为新分配的内存的地址,当*a = b; 后*a相当于指针变量b,指向的是新内存的地址,而指向指针的指针变量a是通过12语句传进来的指针变量m的地址,那么*a的指向也就是m的指向。那么当运行13句的时候会打印出新内存地址中的数据a. 而a = &b; a中的内容是指针变量b的地址,也就是a指向了指针变量b,然而b 是在函数ints中的临时变量,当函数ints结束时b被收回了,所以a指向的地址就成了不过预见的了,所以当13句再被运行时m所指的内存的内容已经不是ints中b所指的新内存中的内容了。 例2中不出现错误的原因也就在这里了,因为指针变量b没有被收回,所以a所指的仍然是指针变量b,而**a表示的也就是新内存地址里的内容了。
C指针新悟!
最新推荐文章于 2024-09-16 20:57:30 发布