我是指向class的新手。我编写简单的代码来表达我的问题
为什么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;
}
答案 0 :(得分:2)
将指针传递给函数就像通过引用传递一样。事实上,这基本上就是引用工作的方式。
此外,对于这两种情况,您的代码中都有未定义的行为。声明局部变量而不同时指定它时,它的值是 indeterminate ,并且对任何内容使用该值都是未定义的。是的,即使访问n.num
是未定义的行为,您获得值0
也就是运气。使用像你这样的指针甚至可能导致程序崩溃。
答案 1 :(得分:1)
f1(n);
n
通过副本传递。因此,它的值在main()
中不会改变。
f2(p);
p
通过副本传递。但是,p
是一个指针,您将值更改为它指向的位置。因此,可以在main()
中更新和查看其指向的值。
不要忘记将内存分配到p
点。
Node n;
Node *p;
p = &n;
答案 2 :(得分:1)
如果此代码真的为您打印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;
}
这也可以帮助回答您的主要问题:指针指向现有对象。这意味着,虽然p2
确实是f2()
中的p
,但它是来自main()
的指针n
的副本。并且它们都指向同一个对象(我的修改中的对象f2()
),这就是{{1}}可以通过其指针的本地副本修改“外部”对象的原因。