The*_* P. 2 c pointers call-by-value
void func(char *p)
{
int q = 13;
p = &q;
printf("%d\n", *p);
}
void main(void)
{
int var = 20;
int *p = &var;
printf("%d\n", *p);
func(p);
printf("%d\n", *p);
}
Run Code Online (Sandbox Code Playgroud)
为何函数退出时指针仍为20?我跳到func()结尾时,在其中修改了指针,最后printf(),该*p值指向堆栈中的一些随机内容。
这是你的
void func(char *p)
{
int q = 13;
p = &q;
}
Run Code Online (Sandbox Code Playgroud)
这意味着“使p指向q”并更改的值p,这只是函数内部的一个变量。函数外部没有变量值的变化。
如果你要写这个
void func(char *p)
{
int q = 13;
*p = q;
}
Run Code Online (Sandbox Code Playgroud)
这意味着“将p指向其的变量将其值更改为13”,这将在外部看到,这意味着varmain中的变量将更改其值(取决于字节序,因为它是int而不是char作为指针声称是)。
如果要在main中更改指针的值,则需要一个双指针:
void func(char **p)
{
int q = 13;
*p = &q;
printf("%d\n", *p);
}
Run Code Online (Sandbox Code Playgroud)
这意味着“使指向p局部变量的指针q”,在这种情况下,您将有一个悬空的指针main。