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

C语言指针参数赋值疑问:为何修改的是j而非预期的i?

函数内修改指针形参为何未改变预期变量的值?

先看你的代码:

void f(int *p,int *q){
  
   p=q;
   *p=2;
}

int i=0,j=1;

int main(){
f(&i,&j);
printf("%d %d",i,j);
}

你的疑惑核心没搞懂C语言的参数传递规则——C语言里所有参数都是值传递,哪怕是指针类型也不例外。

具体拆解执行过程:

  • 调用f(&i, &j)时,系统会创建两个局部指针变量p和q,分别把&i(i的地址)、&j(j的地址)的副本存进去。这时候p和&i是两个独立的变量,只是它们的值相同;q和&j同理。
  • 执行p=q:这一步只是把局部变量p里的内容改成了q里的内容(也就是&j),完全和实参&i没关系——你改的是副本,原变量(也就是&i对应的实参位置)根本没被触动。
  • 执行*p=2:此时p已经指向了j的地址,所以这行代码就是给j赋值2,自然j的值变了,而i的地址从来没被修改过,i的值还是初始的0。

如果想让i的值变成2,直接删掉p=q这行就行——原来的p本来就指向i的地址,*p=2直接修改i的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:35:28