我有點困惑C++中的分配:指針引用賦值
Q1:爲什麼這個工程:
int *z = &x;(1)
,而這一點,當然,不工作:
*z = &x;(2)
Q2:同一種問題的功能:
funct(int *z)
而且你怎麼稱呼它:
int x;
func(&x);
意思*z=&x
? 我知道我通過了上述情況下的地址(z=&x
)。但是,任務兩邊的兩個條款應該完全一樣嗎?
我有點困惑C++中的分配:指針引用賦值
Q1:爲什麼這個工程:
int *z = &x;(1)
,而這一點,當然,不工作:
*z = &x;(2)
Q2:同一種問題的功能:
funct(int *z)
而且你怎麼稱呼它:
int x;
func(&x);
意思*z=&x
? 我知道我通過了上述情況下的地址(z=&x
)。但是,任務兩邊的兩個條款應該完全一樣嗎?
當你寫,*z = &x;
,你去引用指針z
,這意味着您要指針對象(一int
)分配到的x
地址分配指針(而不是指針對象),請寫z = &x;
int *z = &x;(1)
delares Z到是類型的「int*
」的「*是類型的一部分,而不是一個指針引用的一部分 - 所以你要分配"z = &x"
,而不是」 *z=&x
「
這應該阿洛斯解釋爲什麼還沒有效果 - 正確的語句(2)將
z = &x;
假設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
,甚至更強,這*z
和x
現在的別名在內存中完全相同的實體!對*z
所做的任何更改都會影響x
,反之亦然;這兩個表達式指向相同的內存位置。
在圖片:
+-------+ +-------+
z | | | | *z
| +---+----------------------------->| |
&x | | | | x
+-------+ +-------+
「你確實得到了'z =&x'的效果」 - 正確,也許值得一提的是,這也意味着'* z == x'(並且顯式**不** ** * z ==&x' ,OP似乎認爲這是一些難以理解的原因)。 – 2013-11-03 07:14:00
好主意。添加了信息,以及(非藝術)圖片。 –
謝謝,upvoted,優秀的解釋。 – 2013-11-03 07:27:03
它是壞的規則寫
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;
在上殼體*和&是聲明的部分,是類型的部分,如「短「是類型」短整型「的一部分。在小寫字母中,它們是表達式的一部分 - 像「+」和「 - 」這樣的運算符。這些是完全不同的東西,儘管你對它們使用相同的符號。
當您編寫type* z
或type *z
時,類型說明符優先,「*」是類型的修飾符。因此,int* z
和int *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
當你寫'int * z'時,你聲明'z'是一個int指針。 'z'的類型就是'int *'。如果您取消引用一個指針(即在聲明中使用'*'__not__),則可以訪問指向的任何「z」。由於'z'是一個int指針,'* z'是一個int。因此(1)是有效的,因爲'int *'在兩邊,而(2)是無效的,因爲你在左邊有'int'。 – Zeta
遵循Zeta的評論,如果它有幫助,(2)將作爲int * z有效; z =&x;'注意在第二條語句中故意忽略的間接引用。 – WhozCraig
我在這個問題上看不到任何參考。 – 2013-11-03 07:12:29