在下面的代码中,输出是20,并解释说在fun()
内部,q
是指针p
的副本。因此,如果我们更改q
以指向其他内容,那么p
不会受到影响。函数复制指针的机制是什么?为什么p
在存储q
地址时不打印 10 .
void fun(int *p)
{
static int q = 10;
p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(p);
printf("%d", *p);
getchar();
return 0;
}
因为该函数fun
按值传递参数。如果要在函数外部修改变量,则需要指针。由于要在函数外部修改int *
指针,因此需要一个int **
指针:
void fun(int **p) //here
{
static int q = 10;
*p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(&p); //and here
printf("%d", *p);
return 0;
}
在C++中,您可以以类似的方式使用按引用传递。
如果我们改变q指向其他东西" - q不指向,它不是一个指针。它是一个整数。如果您的意思是"如果我们更改 q 的值",例如
q = 12
然后发生了两件事。
- p没有改变,因为它仍然指向q的位置(它是一个地址)
*p 确实会从 10 更改为 12,因为 *p 表示"值在"
最后"为什么p不打印10"
主函数中的 p 与"有趣"函数中的 p 不同。 它们以相同的值开始,因为你传递它(fun(p)),但是当你改变它(p = &q)时,你是在改变fun中的p,而不是main中的p。 所以 p 仍然指向 &r(不是 &q),所以 *p 是 20
解释在 fun() 中,q 是指针 p 的副本
不。fun
中的p
是主p
的副本。
因此,如果我们更改 q 以指向其他内容
q
不是指针。你不能让它指向别的东西,或者根本不能指向任何东西。
函数复制指针的机制是什么?
函数调用中的参数:
fun(p); // this p here
复制到函数定义中的参数:
void fun(int *p) // this p here
为什么 p 在存储 q 的地址时不打印 10。
因为p
不存储q
的地址。至少,不是主要的p
,谁是你正在打印的取消引用值。只有 fun
中的p
指向q
.但这是函数的局部变量,你没有对它做任何事情。
有两个不同的变量,都称为p
。
其中一个在 main()
中声明,另一个在 fun()
中声明(参数列表中声明的变量是函数的局部变量)。它们不会冲突,因为它们是不同函数中的局部变量,但它看起来确实令人困惑。
请注意,如果fun()
中的引用被称为pp
而不是p
,则会生成相同的代码,但您不会将它们视为相同的变量。