C++指针值发生变化

C++ pointers value changing

本文关键字:变化 指针 C++      更新时间:2023-10-16

你好,我有这样的简单代码

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都引用同一个变量。

当你在你给一个方法的参数之前使用&时,它不会被复制,而是链接到它

因此:

  1. 您更改链接到 b 的 x

  2. 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