2016-01-23 73 views
-2

我正在學習一些C++,並且遇到了指針和地址。但是,在任何材料中,我都能找到關於何時使用指針以及何時使用地址的很好解釋。據我瞭解,當我使用指針時,我指向內存中的地址,其中存儲了一些變量。因此,例如:什麼時候應該使用*以及何時&?

int x = 5; 
int k* = &x; 

這將意味着:

k represents x 

當我改變k,我也改變x值。

我的問題如下:何時應該使用指針,什麼時候應該使用地址?當我聲明一個函數時,我應該使用指針還是地址作爲變量?

+1

指針*是*地址。 '&x'表示'指向x'又名'x'的地址。 – bereal

+0

哦。所以當我改變'k'的值時,我不會改變x? – uksz

+0

我不會說'k代表x',但'k指向x',應該是'k'包含'x'的地址作爲它的值(這就是它指向它的原因)。 – nbro

回答

3

你有一個錯字。它應該是:

int x = 5; 
int *k = &x; 

應讀作:kx。或者,如果你堅持「代表」字:*k代表x

&運算符將任何變量作爲參數並返回其地址(指針)。 *獲取一個指針(地址)作爲參數並返回存儲在那裏的值。因此,他們是相反的操作:&*k是相同的k*&x就像x。你可以看一下這些表達是這樣的:

x //an integer 
k //pointer to integer 
&x //pointer to x 
*k //integer pointed to by k 
*&x //integer pointed to by a pointer to x, that is x 
&*k //pointer to the integer pointed to by k, that is k 

注意,運營商&只能在變量被使用,因爲一般表達式沒有地址,只有變量做(當然,和臨時,但那是另一回事)。例如,這種表達是無效的:

&(x + 1) //error! 

與這些運營商最有趣的是一個指針的聲明爲:

int *k; 

你可能會認爲,這將是更好的寫法如下int &k,但是這不是如何用C++讀取聲明符。取而代之的是,該聲明應被解讀爲:

int (*k); 

就是*k是一個整數,因此它的結果k是指向一個整數。現在

,與初始化的聲明是怪異:

int *k = &x; 

實際上應理解爲:

int (*k); 
k = &x; 

也就是說,你聲明*k爲整數,因此,k是一個指針-to-整數。然後你初始化k(指針),地址爲x

其實你可以創建任何類型的指針,甚至指針的指針,指針的指針的指針...但是請注意,這個語法是非法的:

int x; 
int **p = &&x; //error, &x is not a variable 

但這是有效的:

int x; 
int *k = &x; 
int **p = &k; 
+0

這真的是很好的答案。然而,我仍然想知道什麼時候我應該使用指針和地址,當我聲明一個函數 - 或者完全沒有關係? – uksz

+0

@uksz:你問什麼時候傳遞函數的變量地址而不是值的副本。當值很大並且你想避免複製,當你想傳遞一個對象數組(當你傳遞一個指向第一個的指針時),當函數需要修改這個值,當你想讓值可選(有一個NULL指針)... – rodrigo

0

指針運算符(*)用於任何時候要指向變量。

地址運算符(&)用於指向變量的內存地址。

1

如果一個變量存儲一個存儲位置的地址,它被認爲是一個指針。因此,int *例如存儲int-變量的地址。通過使用取消引用運算符*,您可以訪問指針地址處的內存位置並分配給它。

爲了得到一個變量的地址,您使用& - 運算符。這就是你的例子。分配給存儲地點,其中x存儲,你會再次使用反引用運營商這樣的:*k = 0;

注意,反引用運營商和*來表達指針類型是兩回事。 *&是彼此的倒置(overloading)運營商,而int *是一種類型。

特別是在C++中,如果&與類型一起使用,則變量的類型是引用類型,例如, const string &s。就像指針類型,這與操作符的地址不同。參考類型不需要使用*進行去引用,但會直接修改它們引用的內存位置。

相關問題