C++指针值发生变化
C++ pointers value changing
你好,我有这样的简单代码
void func(int &x, int y, int* z){
int a = 3;
int b = 1;
cout << *z << endl;
x = *z + b;
cout << *z << endl;
y = *z + x;
z = &a;
cout << "func: x = " << x << endl;
cout << "func: y = " << y << endl;
cout << "func: *z = " << *z << endl;
cout << "func: a = " << a << endl;
cout << "func: b = " << b << endl;
return;
}
int main(){
int a = 2;
int b = 4;
func(b, a, &b);
cout << "main: a = " << a << endl;
cout << "main: b = " << b << endl;
return 0;
}
对于输出,我得到
4
5
func: x = 5
func: y = 10
func: *z = 3
func: a = 3
func: b = 1
main: a = 2
main: b = 5
所以我的问题是,由于什么原因,*z 的值在x = *z + b
后会发生变化,因为我自己无法弄清楚。
提前谢谢你
x
是对main中b
的引用(不要与func中的b
混淆,后者是分开的)。 z
是指向 main 中b
的指针。引用基本上是指针,但没有*
或&
语法,你不能让它们指向其他东西(没有等效的z = &a
引用)。
该行:
x = *z + b;
基本上是在做:
b_in_main = b_in_main + b_in_func;
因为x
和*z
都引用同一个变量。
当你在你给一个方法的参数之前使用&时,它不会被复制,而是链接到它。
因此:
-
您更改链接到 b 的 x
-
z 与 B 的新值相对应,因为它链接到它。
x = *z + b;
更改 z 的值,因为:
- 在这里,x 是一个指向调用方变量 b
的 int 引用- z 是一个 int 指针,包含相同变量 b
的地址因此,在这一点上,x 和 z 指的是同一件事。
因此,将新值分配给 x 意味着将该值分配给 b。由于 z 指向 b,因此之后读取 z 会给出您分配给 x 的值。
你可以确保这一点,例如通过编写和比较 x 的地址和 z 的值:
cout << "(1) z is: " << z << " - &x is: " &x
// should be the same
z = &a;
cout << "(2) z is: " << z << " - &x is: " &x
// should be the different
在您的上下文中,这两个值将相同,直到您重新分配 z。
因为您将它更改为指向局部变量 a
z = &a;
因此,当您取消引用它时,它会为您提供局部变量 a 的值,即 3
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- C++取消引用指针.为什么会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 单次运行时指针值的变化
- 从旧的 C 样式指针移动到C++智能指针,代码几乎没有变化
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 指针参数根据输出而变化
- C++指针值发生变化
- 指针如何变化
- 链表头指针在传递给函数c++时发生变化
- 将指针从一个向量复制到另一个向量;地址指出了变化
- 如果我将堆栈上分配的元素的指针推入 std::vector,则其成员的值会发生变化
- 迭代器的指针在循环中如何变化C++
- 为什么指针会发生变化
- 在C++中遍历树时指针发生变化
- 指针随时间的改进/变化