如何以及何时复制指针

How and when is copy of pointer made

本文关键字:复制 指针 何时      更新时间:2023-10-16

在下面的代码中,输出是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,则会生成相同的代码,但您不会将它们视为相同的变量。