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

C++函数中指针参数为何可被修改?值传递与指针传递疑问

嘿,这事儿其实是C++里值传递和指针传递的核心区别,我给你唠明白~

先拆解第一个例子:值传递的本质

你写的第一个函数代码是这样的:

void add(double x) { 
    x = x + 3; 
} 
int main() { 
    double x = 2; 
    add(x); 
}

当你调用add(x)的时候,C++会做一件事:把main里原变量x的值(也就是2)复制一份,传给函数add里的参数x。划重点:这两个x是完全独立的变量!一个在main的栈空间里,一个在add的栈空间里,八竿子打不着。

所以你在add里修改的只是那个临时的副本,原变量根本没被碰过,最后main里的x自然还是2,不会变成5。

再看指针的情况:传递的是地址副本,但指向同一块内存

再看你的第二个代码:

void fill(int *t) { 
    for (int j=0; j<10; j++){ 
        t[j] = j; 
    } 
} 
int main() { 
    int* p; 
    p = new int[10]; 
    fill(p); 
}

这里main里的p是个指针,它存的是什么?是你用new分配的那10个int的内存起始地址。当你调用fill(p)时,C++同样会复制一份这个地址,传给函数里的t——也就是说,t和p是两个不同的指针变量,但它们指向的是同一块内存区域!

那t[j]其实等价于*(t + j),翻译成人话就是:“找到指针t指向的起始地址,往后偏移j个int的位置,然后修改这个位置上的内容”。你修改的是这块内存里的数据,而不是指针t本身。所以当fill执行完,main里的p还是指向原来的那块内存,只不过里面的内容已经被fill函数填好了,打印的时候自然能看到0到9的整数。

一句话总结区别

  • 值传递:参数是原变量的值副本,改副本不影响原变量
  • 指针传递:参数是指针的地址副本,但两个指针指向同一块内存,所以修改指针指向的内容会直接改变原内存里的数据

内容的提问来源于stack exchange,提问作者mlx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:11