C++ 如何以及何时制作指针副本
在下面的代码中,输出是20,并解释了C++ 如何以及何时制作指针副本,c++,c,pointers,C++,C,Pointers,在下面的代码中,输出是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); getc
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++中,你可以用类似的方法来使用传递引用。< /p> “如果我们改变Q指向其他的东西”——Q不指出,它不是指针。它是一个整数。
如果你的意思是“如果我们改变q值”,比如
q = 12
然后发生了两件事
- p不会改变,因为它仍然指向q的位置(它是一个地址)
- *p确实会从10变为12,因为*p表示“值在” 最后,“为什么p不打印10”
fun
中的p
是main中p
的副本
所以如果我们把q改成其他点
q
不是指针。你不能让它指向其他东西,或者指向任何东西
函数复制指针的机制是什么
函数调用中的参数:
fun(p); // this p here
复制到函数定义中的参数:
void fun(int *p) // this p here
为什么p在存储q地址时不打印10
因为
p
不存储q
的地址。至少,不是main中的p
,而是您正在打印的解引用值。只有fun
中的p
指向q
。但是这是函数的一个局部变量,您没有对它做任何操作。有两个不同的变量,都称为p
其中一个在main()
中声明,另一个在fun()
中声明(参数列表中声明的变量是函数的本地变量)。它们并不冲突,因为它们是不同函数中的局部变量,但看起来确实很混乱
请注意,如果调用
fun()
中的引用pp
,而不是p
,则会产生相同的代码,但您不会混淆,认为它们是相同的变量。在fun()
中,q
是一个局部整数p
是有效忽略的函数参数;p
的本地副本指向q
,但由于函数返回,因此该信息未被使用。如果你写了(在fun()
)*p=q
,然后在main()
函数中为r
(和*p
)赋值10。p的本地副本是如何生成的,为什么生成的,以及为什么在C中调用函数时“p是有效忽略的函数的参数”,参数按值传递;复制品是有价值的。在fun(int*p)
的情况下,该值是指针的值;在调用代码中(令人困惑的是),您有int*p=&r;乐趣(p)
,因此从main()
存储在p
中的指针值的副本将成为fun()
中局部变量p
的初始值。您可以忽略传递给fun()
的值,方法是立即用q
“how and why…?”的地址覆盖该值。参数列表在函数中声明局部变量,该变量可能与程序中的其他变量同名。如果希望有一个p
变量,请在顶层(任何函数外部)声明,不要将其作为参数传入。