C++ 如何以及何时制作指针副本

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

在下面的代码中,输出是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++中,你可以用类似的方法来使用传递引用。< /p> “如果我们改变Q指向其他的东西”——Q不指出,它不是指针。它是一个整数。 如果你的意思是“如果我们改变q值”,比如

q = 12
然后发生了两件事

  • p不会改变,因为它仍然指向q的位置(它是一个地址)
  • *p确实会从10变为12,因为*p表示“值在”

    最后,“为什么p不打印10”

主函数中的p与“fun”函数中的p不同。它们以相同的值开始,因为你传递了它(fun(p)),但是当你改变它(p=&q)时,你改变的是fun中的p,而不是main中的p。所以p仍然指向&r(而不是&q),所以*p是20

解释如下:在fun()中,q是指针p的副本

否。
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
变量,请在顶层(任何函数外部)声明,不要将其作为参数传入。