通过调用另一个函数将指针移动到某个地址

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应继续指向该位置甚至在功能上与应该打印相同的地址同样.这有什么问题?

Sou*_*osh 6

考虑到你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()是一个可变参数函数,对于指针,不会发生默认参数提升,因此提供的参数类型需要显式匹配预期的类型.否则,从技术上讲,它是 未定义的行为.