为什么指向类的指针可以通过函数调用来更改值

Why can a pointer to class can change value via function call?

本文关键字:函数调用 可以通过 指针 为什么      更新时间:2023-10-16

我是指向类的新手。我写了简单的代码来显示我的问题。
为什么 p->num 可以在 f2 中设置值?指针 p 不像 n ?只是一个局部变量?
n1 和 p2 的范围不是只在 f1 和 f2 中分开吗? 谢谢
它们之间有什么不同!

class Node{
public:
   int num;
   Node* next;
};
void f1(Node n1){
   n1.num = 50;
}
void f2(Node*p2){
   p2->num= 100;
}
int main(){     
   Node n;
   f1(n);
   cout<<n.num<<endl;//output 0
   Node*p;
   f2(p);
   cout<<p->num<<endl;//output 100
   return 0;    
}

将指针传递给函数就像通过引用传递一样。事实上,这基本上就是引用在引擎盖下的工作方式。

此外,对于这两种情况,代码中都有未定义的行为。当您声明一个局部变量而没有同时赋值它时,它的值是不确定的,并且将该值用于任何内容都是不确定的。是的,即使访问n.num也是未定义的行为,您获得的价值0这只是运气。像您一样使用指针甚至可能导致程序崩溃。

如果这段代码真的为你打印100,那么你非常幸运(或者不走运,基于观点)。有一个问题,p没有指向任何东西,所以当你写进它时,你写进了随机内存。你应该初始化它,也许是这样的:

int main(){     
   Node n;
   f1(n);
   cout<<n.num<<endl;//output 0
   Node *p = &n;  //now `p` will point to the Node object `n`
   f2(p);
   cout<<p->num<<endl;//output 100
   return 0;    
}

这也有助于回答您的主要问题:指针指向现有对象。这意味着虽然p2f2()中确实是本地的,但它是从main() p的指针的副本。它们都指向同一个对象(在我的修改中n对象),这就是为什么f2()可以通过指针的本地副本修改"外部"对象的原因。

f1(n);

n通过副本传递。因此,它的价值在main()中不会改变。

f2(p);

p通过副本传递。但是,p是一个指针,您要将值更改为它指向的位置。因此,可以在main()中更新和查看它所指向的值。

不要忘记将内存分配到p点的位置。

Node n;
Node *p;
p = &n;