Gau*_*rav -2 c pointers function-calls
为什么在此代码中指针转移到另一个位置:
#include <stdio.h>
void f(int *p)
{
int j=2;
p=&j;
printf("%d\n%p\n%d\n",*p,&j,p);
}
int main(void)
{
int *q;
int m=98;
q=&m;
f(q);
printf("%p ",q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
2
0x7ffff5bf1bcc
0x7ffff5bf1bcc
0x7ffff5bf1bc8
我明白,当函数f()与打印值完成j和地址 j的内存占用j追溯到堆栈,但IMO p应继续指向该位置甚至在功能上与应该打印相同的地址主同样.这有什么问题?
考虑到你printf("%p ", (void *)q);在实际代码中的意思,
不,C中的函数参数是通过值传递的.它不会将对参数所做的更改反映到所使用的实际参数中(在函数调用中).
换句话说,函数参数是函数(调用)作用域的本地参数,对它们所做的任何更改都不会反映到实际参数中.
因此,如果需要更改指针,则需要将指针传递给需要更改的指针.
考虑一个相当轻松但现实的场景.
void f (int x) { x = 10; }
int main(void) { f(5); printf ("%d", 5); return 0;}
Run Code Online (Sandbox Code Playgroud)
现在,你期望它打印10吗?
那说,一个建议.始终将参数%p转换为转换说明符(void *)(如果尚未转义).printf()是一个可变参数函数,对于指针,不会发生默认参数提升,因此提供的参数类型需要显式匹配预期的类型.否则,从技术上讲,它是 未定义的行为.