0

我是指向类的新手。我编写简单的代码来显示我的问题。
为什么 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;    
}
4

3 回答 3

2

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

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

于 2013-11-01T17:59:03.977 回答
1
f1(n);

n是通过副本传递的。因此,它的值在main().

f2(p);

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

不要忘记将内存分配到 wherep点。

Node n;
Node *p;
p = &n;
于 2013-11-01T18:01:26.197 回答
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确实是本地 in ,但它是指针fromf2()的副本。而且它们都指向同一个对象(我修改中的对象),这就是为什么可以通过指针的本地副本修改“外部”对象的原因。pmain()nf2()

于 2013-11-01T18:01:36.253 回答