2013-11-03 95 views
2

我有點困惑C++中的分配:指針引用賦值

Q1:爲什麼這個工程:

int *z = &x;(1) 

,而這一點,當然,不工作:

*z = &x;(2) 

Q2:同一種問題的功能:

funct(int *z) 

而且你怎麼稱呼它:

int x; 
func(&x); 

意思*z=&x? 我知道我通過了上述情況下的地址(z=&x)。但是,任務兩邊的兩個條款應該完全一樣嗎?

+0

當你寫'int * z'時,你聲明'z'是一個int指針。 'z'的類型就是'int *'。如果您取消引用一個指針(即在聲明中使用'*'__not__),則可以訪問指向的任何「z」。由於'z'是一個int指針,'* z'是一個int。因此(1)是有效的,因爲'int *'在兩邊,而(2)是無效的,因爲你在左邊有'int'。 – Zeta

+0

遵循Zeta的評論,如果它有幫助,(2)將作爲int * z有效; z =&x;'注意在第二條語句中故意忽略的間接引用。 – WhozCraig

+0

我在這個問題上看不到任何參考。 – 2013-11-03 07:12:29

回答

0

當你寫,*z = &x;,你去引用指針z,這意味着您要指針對象(一int)分配到的x
地址分配指針(而不是指針對象),請寫z = &x;

2
int *z = &x;(1) 

delares Z到是類型的「int*」的「*是類型的一部分,而不是一個指針引用的一部分 - 所以你要分配"z = &x",而不是」 *z=&x

這應該阿洛斯解釋爲什麼還沒有效果 - 正確的語句(2)將

z = &x; 
4

假設x被聲明爲int

int x; 

那麼你的第一線

int *z = &x; 

說聲明z是指向int類型的指針。使用指向int x的指針初始化它。都好。它類型檢查罰款。 z是一個指向int的指針,所以是&x

但現在

*z = &x; 

失敗,因爲z是一個指向一個int,所以*z是一個int!您不能將int指針&x指定給int。這是一種類型不匹配。

現在在你的函數調用問題

void func(int *z) {...} 

您的通話

func(&x); 

是罰款。它將&x指向int的指針通過值傳遞給參數z,該參數本身是指向int的指針。在func裏面,你的確會得到z = &x的效果。通過值傳遞的參數非常像賦值。

附錄

的原因,您將看到傳遞給一個指針類型,如int *z聲明的參數的值,如&x是,它允許呼叫者的x通過參數z進行修改。換句話說:

void func(int *z) { 
    *z = *z + 1; 
} 

如果這樣調用

int main() { 
    int x = 10; 
    func(&x); 
    cout << x << '\n'; 
} 

將輸出11傳遞到&x意味着z這兩者z == &x*z == x,甚至更強,這*zx現在的別名在內存中完全相同的實體!對*z所做的任何更改都會影響x,反之亦然;這兩個表達式指向相同的內存位置。

在圖片:

 +-------+        +-------+ 
    z |  |        |  | *z 
    | +---+----------------------------->|  | 
&x |  |        |  | x 
    +-------+        +-------+ 
+1

「你確實得到了'z =&x'的效果」 - 正確,也許值得一提的是,這也意味着'* z == x'(並且顯式**不** ** * z ==&x' ,OP似乎認爲這是一些難以理解的原因)。 – 2013-11-03 07:14:00

+0

好主意。添加了信息,以及(非藝術)圖片。 –

+0

謝謝,upvoted,優秀的解釋。 – 2013-11-03 07:27:03

1

它是壞的規則寫

int *z; 

更好寫

int* z; 

這導致了這樣的困惑。 這裏z是變量,int *是一個類型,類似於float和int類型。這種類型被稱爲指針。它在內存中存儲可以存儲變量(包括指針)的地址。

在C++中,您將一個類型的值分配給另一個。所以在這裏你分配的每一個z = & x。這是可行的,因爲& x給你一個指向x的指針。這確實意味着你的int x變量所在的內存地址。


您也不應該混淆變量聲明:

int* z; 
int x; 
float& f; // reference variable 

和表達:

*z; 
&f; 

在上殼體*和&是聲明的部分,是類型的部分,如「短「是類型」短整型「的一部分。在小寫字母中,它們是表達式的一部分 - 像「+」和「 - 」這樣的運算符。這些是完全不同的東西,儘管你對它們使用相同的符號。

+0

謝謝,這清除了混亂! – Hyperloop

+0

沒有足夠的聲望upvote,也不知道如何接受答案。 Srry :) – Hyperloop

0

當您編寫type* ztype *z時,類型說明符優先,「*」是類型的修飾符。因此,int* zint *z的意思是「聲明z,使得z是指向int類型的指針」。

int* z = &i; // pointer-to-int z = the address of i 

int *z;  // z is a pointer-to-int 
z = &i;  // pointer-to-int z = the address of i 

int *z;  // z is a pointer-to-int 
*z = &i;  // take the address of i and store it in integer who's address z contains