为什么指向类的指针可以通过函数调用来更改值
Why can a pointer to class can change value via function call?
我是指向类的新手。我写了简单的代码来显示我的问题。
为什么 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;
}
这也有助于回答您的主要问题:指针指向现有对象。这意味着虽然p2
在f2()
中确实是本地的,但它是从main()
p
的指针的副本。它们都指向同一个对象(在我的修改中n
对象),这就是为什么f2()
可以通过指针的本地副本修改"外部"对象的原因。
f1(n);
n
通过副本传递。因此,它的价值在main()
中不会改变。
f2(p);
p
通过副本传递。但是,p
是一个指针,您要将值更改为它指向的位置。因此,可以在main()
中更新和查看它所指向的值。
不要忘记将内存分配到p
点的位置。
Node n;
Node *p;
p = &n;
相关文章:
- 变量没有改变?通过向量的函数调用
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 通过直接函数调用将 std::p romise 对象传递给函数
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 是否可以使用三元切换/控制/谓词成员函数调用?
- C++::在构造函数退出之前通过指针调用成员函数
- 为什么缺少名称的函数调用仍然可以编译
- 为什么我可以通过野生指针调用成员函数
- 需要"模板<>"语法 --> 通过函数调用类模板
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- 是否可以从移动构造函数调用默认构造函数?
- 现代编译器是否可以在使用依赖关系注入时取消虚拟化函数调用
- 带有 std::function 的 ADL:可以通过 std::function 参数列表中的类型找到采用 std::function 对象的函数吗?
- 通过引用常量函数调用另一个类的非常量函数
- 可以通过跨二进制边界传递的对象上的接口调用虚拟函数吗?
- 是否可以通过列表初始化调用用户定义的转换函数
- 为什么指向类的指针可以通过函数调用来更改值
- 可以将用于向std::字符串返回const ref的函数更改为通过值break调用代码返回
- 有没有一种方法可以通过函数指针来调用操作符函数?
- 函数调用可以重新排序吗?