C++ 指针问题 - 通过方法更新指针
c++ pointer issue - update pointer through method
我是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 的地址更改值。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将成员函数指针作为参数传递给模板方法
- 通过函数指针定义类范围之外的方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 如何访问由共享指针保存的类方法?
- 初始化指向类实例的智能指针并访问其方法
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 有没有将变量名称转换为双指针的简短方法?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 类指针方法崩溃程序
- 证明两指针方法有效(对和)
- Qt 删除指针方法
- 我如何将一些类的指针方法转换为指针函数