Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指针值更改_C++_Linux_Pointers - Fatal编程技术网

C++ C++;指针值更改

C++ C++;指针值更改,c++,linux,pointers,C++,Linux,Pointers,你好,我有这样的简单代码 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 <&

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

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;
}
所以我的问题是,为什么*z的值在
x=*z+b
之后会发生变化,因为我自己无法理解它


提前感谢

x
主要是指
b
(不要与func中的
b
混淆,后者是单独的)
z
是指向main中
b
的指针。引用基本上是指针,但是没有
*
&
语法,您不能让它们指向其他东西(对于引用,没有与
z=&a
等价的东西)

该行:

x = *z + b;
基本上是这样做的:

b_in_main = b_in_main + b_in_func;

因为
x
*z
都引用了同一个变量。

x
是对main中
b
的引用(不要与func中的
b
混淆,后者是分开的)
z
是指向main中
b
的指针。引用基本上是指针,但是没有
*
&
语法,您不能让它们指向其他东西(对于引用,没有与
z=&a
等价的东西)

该行:

x = *z + b;
基本上是这样做的:

b_in_main = b_in_main + b_in_func;

因为
x
*z
都引用同一个变量。

因为您将其更改为指向局部变量a

z = &a;

因此,当您取消引用它时,它会给出局部变量a的值,即3,因为您将其更改为指向局部变量a

z = &a;

因此,当您取消引用它时,它会给您局部变量a的值,当您使用&在您给方法提供参数之前,它不会被复制,而是链接到它

以便:

  • 您可以更改链接到b的x

  • z与b的新值相对应,因为它已链接到z


  • 在给方法指定参数之前使用&时,该参数不会被复制,而是链接到它

    以便:

  • 您可以更改链接到b的x

  • z与b的新值相对应,因为它已链接到z

  • 更改z的值,因为:
    -这里,x是一个int引用,指向调用方端变量b
    -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
    
    cout
    更改z的值,因为:
    -这里,x是一个int引用,指向调用方端变量b
    -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
    

    不能谢谢:)现在我明白了:)谢谢:)现在我明白了:)我问了其他的事。谢谢你的回答,但这不是我的问题:)你没问为什么在这行x=*z+b之后*z的值会改变吗?是的,但是你的答案在下面两行,在
    x=*z+b
    时没有执行。我的意思是两个cout,在第一个
    *z==4
    中,在
    x=*z+b
    *z==5
    之后。。以上答案是正确的。我问了另外一件事。谢谢你的回答,但这不是我的问题:)你没问为什么在这行x=*z+b之后*z的值会改变吗?是的,但是你的答案在下面两行,在
    x=*z+b
    时没有执行。我的意思是两个cout,在第一个
    *z==4
    中,在
    x=*z+b
    *z==5
    之后。。以上答案是正确的