我正在學習一些C++,並且遇到了指針和地址。但是,在任何材料中,我都能找到關於何時使用指針以及何時使用地址的很好解釋。據我瞭解,當我使用指針時,我指向內存中的地址,其中存儲了一些變量。因此,例如:什麼時候應該使用*以及何時&?
int x = 5;
int k* = &x;
這將意味着:
k represents x
當我改變k
,我也改變x
值。
我的問題如下:何時應該使用指針,什麼時候應該使用地址?當我聲明一個函數時,我應該使用指針還是地址作爲變量?
我正在學習一些C++,並且遇到了指針和地址。但是,在任何材料中,我都能找到關於何時使用指針以及何時使用地址的很好解釋。據我瞭解,當我使用指針時,我指向內存中的地址,其中存儲了一些變量。因此,例如:什麼時候應該使用*以及何時&?
int x = 5;
int k* = &x;
這將意味着:
k represents x
當我改變k
,我也改變x
值。
我的問題如下:何時應該使用指針,什麼時候應該使用地址?當我聲明一個函數時,我應該使用指針還是地址作爲變量?
你有一個錯字。它應該是:
int x = 5;
int *k = &x;
應讀作:k
點x
。或者,如果你堅持「代表」字:*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;
指針運算符(*)用於任何時候要指向變量。
地址運算符(&)用於指向變量的內存地址。
如果一個變量存儲一個存儲位置的地址,它被認爲是一個指針。因此,int *
例如存儲int
-變量的地址。通過使用取消引用運算符*
,您可以訪問指針地址處的內存位置並分配給它。
爲了得到一個變量的地址,您使用&
- 運算符。這就是你的例子。分配給存儲地點,其中x
存儲,你會再次使用反引用運營商這樣的:*k = 0;
注意,反引用運營商和*
來表達指針類型是兩回事。 *
和&
是彼此的倒置(overloading)運營商,而int *
是一種類型。
特別是在C++中,如果&
與類型一起使用,則變量的類型是引用類型,例如, const string &s
。就像指針類型,這與操作符的地址不同。參考類型不需要使用*
進行去引用,但會直接修改它們引用的內存位置。
指針*是*地址。 '&x'表示'指向x'又名'x'的地址。 – bereal
哦。所以當我改變'k'的值時,我不會改變x? – uksz
我不會說'k代表x',但'k指向x',應該是'k'包含'x'的地址作爲它的值(這就是它指向它的原因)。 – nbro