C语言双指针解引用问题及change1/change2访问变量b的逻辑疑惑
关于你遇到的两个C语言问题的解答
1. 双指针的解引用问题
首先得明确:双指针(比如int **pp)是指向指针的指针,解引用需要分两步来操作:
- 第一次解引用
*pp:得到的是它指向的那个指针变量(类型是int*) - 第二次解引用
**pp:才能拿到最终指向的整型变量的值
举个简单的正确示例帮你理解:
int num = 42; int *p = # // p指向num int **pp = &p; // pp指向p printf("num的值:%d\n", **pp); // 两次解引用,输出42 printf("p的地址:%p\n", *pp); // 一次解引用,得到p的值(也就是num的地址)
你觉得“无法解引用”,大概率是只做了一次解引用就想直接拿值,或者指针类型不匹配导致编译报错。比如直接写printf("%d", *pp);就会报错,因为*pp是指针类型,不是整型。
2. 代码输出的详细分析
先把你的代码贴出来方便对照:
#include<stdio.h> int a = 5, b = 10; void change1(int *p); void change2(int **pp); main( ) { int x=20, *ptr=&x; printf("%d ",*ptr); change1(ptr); printf("%d ",*ptr); change2(&ptr); printf("%d\n",*ptr); } void change1(int *p) { p = &a; } void change2(int **pp) { *pp = &b; }
咱们一步一步走执行流程,就能明白输出的由来:
- 第一个输出20:main里
ptr指向x(值为20),*ptr直接取x的值,这部分你已经理解了。 - 第二个输出还是20:调用
change1(ptr)时,C语言是值传递——change1里的参数p是ptr的一个副本,和ptr是完全独立的两个变量。你在change1里写p = &a;,只是修改了这个副本的指向,完全不会影响main里原来的ptr,所以ptr依然指向x,*ptr还是20。 - 第三个输出10:调用
change2(&ptr)时,你传的是ptr的地址,也就是change2里的pp是指向ptr本身的双指针。*pp = &b;这句话的意思是:修改pp所指向的那个指针(也就是main里的ptr)的指向,让它指向全局变量b。所以此时ptr不再指向x了,*ptr就是b的值10。
核心要点:如果想在函数里修改主函数中指针的指向,必须传递指针的地址(也就是用双指针),否则只是修改了函数内部的副本,对原指针毫无影响。
内容的提问来源于stack exchange,提问作者xinix
相关产品推荐
相关产品推荐

