为何修改指针b解引用的值后,指针a解引用的值未同步变化?
为啥修改b后a没变化?这是指针的核心逻辑坑!
嘿,这个困惑我初学指针时也实打实踩过,太懂这种“我明明改了怎么没反应”的懵圈感😅 本质原因只有一个:你的指针a和b根本没指向同一块内存地址,或者你在操作时不小心让它们的指向分道扬镳了。
我给你拆解两种最常见的场景:
场景1:a和b从一开始就指向不同变量
比如你写了这样的代码:
int num1 = 10; int num2 = 20; int *a = &num1; // a存的是num1的内存地址 int *b = &num2; // b存的是num2的内存地址 *b = 30; // 修改的是num2所在地址的内容 printf("%d", *a); // 输出还是10,因为a指向的num1根本没被改动
指针的本质是「存储内存地址的变量」,a和b里存的是两个完全独立的地址,对应两块不相关的内存空间,修改其中一个自然和另一个没关系。
场景2:函数传参时不小心复制了指针
另一种高频踩坑场景是在函数里操作指针,但C语言的函数参数是值传递——指针本身也会被复制一份临时副本,导致你修改的是函数内部的局部指针,和外面的a半毛钱关系都没有:
void modify_ptr(int *b) { int new_num = 50; b = &new_num; // 这里改的是函数里的临时指针b,不是main里的a *b = 60; } int main() { int num = 10; int *a = # modify_ptr(a); printf("%d", *a); // 输出还是10,因为a的指向根本没被碰过 }
你以为在函数里改了b的指向,但实际上只是修改了个跟外部a无关的临时变量,外面的a依然牢牢指向原来的num。
怎么让a和b同步变化?
核心就是让a和b存储同一个内存地址!比如:
int num = 10; int *a = # int *b = a; // 把a里的地址赋值给b,现在俩指针指向同一块内存 *b = 20; // 修改这块内存的值 printf("%d", *a); // 输出20,完美同步!
如果是函数传参场景,要是想修改指针本身的指向,就得用指针的指针(也就是int **),比如:
void modify_ptr(int **b) { static int new_num = 50; // 用static避免栈内存销毁 *b = &new_num; // 修改的是外部指针的指向 **b = 60; } int main() { int num = 10; int *a = # modify_ptr(&a); printf("%d", *a); // 输出60,成功修改了a的指向和对应值 }
快速排查小技巧
你可以在代码里打印a和b的地址,看看是不是完全相同:
printf("a指向的地址:%p\n", a); printf("b指向的地址:%p\n", b);
如果输出的地址不一样,那肯定不会同步;如果地址完全一致,那修改b必然会影响a。
内容的提问来源于stack exchange,提问作者ZEWEI CHU
相关产品推荐
相关产品推荐

