You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改指针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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:35:34