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

时间:2013-11-01 17:56:44

标签: c++ function pointers

我是指向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;    
}

3 个答案:

答案 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}}可以通过其指针的本地副本修改“外部”对象的原因。