C++ 指针问题 - 通过方法更新指针

c++ pointer issue - update pointer through method

本文关键字:指针 方法 更新 问题 C++      更新时间:2023-10-16

我是c++编程的新手。玩了一下指针。但我不明白下面给出的程序如何打印 20 而不是 10。

据我说,它应该是10!但它打印了20。

我想在指针中获得一个清晰的概念,但它变得越来越难。如果有人详细解释,那将非常有帮助。

蒂亚

void fun(int *p) 
{ 
int q = 10; 
p = &q; 
}     
int main() 
{ 
int r = 20; 
int *p = &r; 
fun(p); 
printf("%d", *p); 
return 0; 
}

参数指针p按值传递,则对p本身的任何修改(而不是p指向的对象(都与传递的参数指针无关。

您可以使其按引用传递,例如

void fun(int *&p) 
{  
p = new int(10); 
}

然后

fun(p); 
delete p;

或者让它通过指针。

void fun(int **p) 
{  
*p = new int(10); 
}

然后

fun(&p); 
delete p;

PS:在您的代码中,您正在尝试将指针分配给局部变量q的地址,该地址在退出函数时被销毁,使指针保持沉默。在对它的任何尊重之后(例如*p( 导致 UB。

@songyuanyao已经回答了,但只是为了帮助您理解,运行此代码并尝试实现差异:

void fun(int &p) 
{ 
int q = 10; 
p = q; 
}     
int main() 
{ 
int r = 20; 
int *p = &r; 
fun(*p); 
printf("%d", *p); 
return 0; 
}

这里的输出是 10,正如您想象的那样。你能弄清楚为什么吗?

更进一步(以更好地理解指针(:)

void f(int *p) {
int q = 10;
*p = q;

} 这也行得通。这里发生了什么?p 是作为原始指针副本的参数。 但是这个参数包含对原始外部变量的地址。 "*p"名称取消引用指向访问由它寻址的值的指针。 "*p = " 表示按包含参数 p 的地址更改值。