2014-02-12 82 views
0

你好,我有簡單的這樣的代碼C++指針值改變

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後的值,因爲我無法自己弄清楚。

預先感謝您

回答

2

x是在主的b(不要與在FUNC的b,其是單獨的相混淆)的引用。 z是主指針b。參考文獻基本上是指針,但沒有*&語法,並且不能使它們指向其他內容(對於引用,沒有等效於z = &a)。

線:

x = *z + b; 

基本上是做:

b_in_main = b_in_main + b_in_func; 

因爲兩者x*z指代相同的變量。

+0

謝謝:)現在我明白了:) – Bankin

0

因爲你改變了它時取消引用它,它給你局部變量,其是3

+0

我問了其他的事情。感謝您的答案,但這不是我的問題:) – Bankin

+0

你不問爲什麼* z的值改變後,這一行x = * z + b; ? – marcadian

+0

是的,但是你的答案在下面兩行,這在'x = * z + b'時不會執行。我的意思是兩個cout,在'x = * z + b'' * z == 5'之後的第一個'* z == 4'中..上述答案是正確的 – Bankin

1

當一個參數之前使用&的值以指向局部變量

z = &a; 

因此你給一個方法,它不會被複制,但鏈接到它

這樣:

  1. 您更改鏈接到B中的對應到B的新值

  2. •改變X,因爲它鏈接到它。

1
x = *z + b; 

改變的Ž,因爲該值:
- 在這裏,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上的兩個值將是相同的。