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
相关产品推荐
相关产品推荐

