這幾天看c++的指標,剛開始的時候還算清楚,看到指向指標的指標這一塊的時候就不淡定了。現假設p為指向指標的指標,看看下面的一堆東西。
p&p*p (void *)*p
**p*p+1*(p+1)**p+1**(p+1)這些東西都代表啥意思呢?輸出是怎樣的?為什麼會這樣?做個試驗看看吧。
試驗**如下:
#includeusing namespace std;
int main();//宣告乙個指標陣列
char **p=test;//宣告乙個指向指標的指標
這個時候就應該問問為什麼了。
第一句非常好理解,p為指向指標的指標,不管他指向什麼,說到底還是指標,那麼他當中存放的就是位址,只不過這個位址是另乙個指標的位址。在本例當中這個另乙個指標就是指向字串「my」首位址的指標。
第二句也非常好理解,p當中不管儲存的是什麼,本身是要占用記憶體的,「&」為位址運算子,那麼&p就是p本身在記憶體當中的位址。
第三句很奇怪,p是乙個指向指標的指標,那麼「*」為間接引用運算子,返回的是指標所指向的物件,本例中他指向乙個指標,那麼取出的不應該是p所指向的指標中儲存的位址麼?我的理解是這樣的,p為指向指標的指標,*p取出的是他所指向的指標中儲存的位址,在本例當中這個位址就是下一句輸出的位址01027894,系統取到這個位址以後,發現這個位址中儲存的是字元型的,所以cout會輸出這些字元,直到遇到『\0』結束輸出,所以本例當中輸出了「my」。
第四句,將*p的型別進行強制轉換,轉成通用型的指標型別,這時候輸出的是這個指標所指向的位址。
第五句,p是乙個指向指標的指標,那麼p指向乙個指標,進行*p運算以後,*p就不再指向乙個指標,而是指向乙個具體的物件,**p就相當於*(*p)運算,這時,返回的就是*p所指向的具體的物件。在本例當中,指向的就是m這個字元。我自己理解的p、*p和**p的區別。p和*p都是指標,而**p是*p所指向的具體的物件。輸出時p和*p都表示的是乙個位址,只不過*p所指向的位址儲存的是字串,cout語句會將這些字串輸出,直到遇到『\0』結束符。
第六句,*p+1由於「*」的優先順序高於「+」,所以先進行*p運算,*p依然是乙個指標,指向字串「my」的首位址,「+1」運算以後就指向了「y」,此時會將「y」後面的字串輸出,只是本例中「y」已經結束,所以只輸出了「y」,假設「y」後面還有字串「abc」,那麼輸出就是「yabc」。
第七句,*(p+1)因為"()"優先順序高於"*",先進行p+1運算,p+1同樣為乙個指向指標的指標,+1運算完成後會指向下乙個指標,再進行「*」運算以後,指向這個指標指向的物件,本例中指向了「name」的首位址,然後輸出「name」。「*p+1」和「*(p+1)」的區別就在於前者先取物件,再移動指標。後者先移動指標,再取指標所指的物件。因為p指向乙個指標陣列,所以後者的操作是合法的。
第八句,**p+1,**p已經不是乙個指標,而是乙個具體的物件,本例中為字母「m」,再進行「+1」運算,是將字母「m」的ascii值和1相加,所以得到110。
第九句,**(p+1),此時先進行指標的移動運算,移動後*(p+1)指向了「name」的首位址,再進行**(p+1)運算,取出這個首位址中的物件,即字元「n」,進行輸出。
最後,水平有限,有理解不到位的地方歡迎指出,說法不正確或者不專業的地方也歡迎指出。
關於指標的一點思考
指標是乙個變數,所不同的是,它存的是位址。因為資料型別決定著如何解釋這個位址 位元組數和操作 因此根據的資料型別的不同,指標又有不同的型別。某個物件 a 的位址範圍為 a,a size n 其中size n是a所佔的位元組數 比如乙個一維陣列int a 10 位址範圍為 a,a 10 sizeof ...
關於指標和指向指標的指標
如果在乙個函式內部你需要修改指標所指向的資料內容,那就使用指標,如果你要修改指標的指向,那就使用指向指標的指標。如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。test函式的語句getmemory str,200 並沒有使str獲得期望的記憶體,str依舊是null。void getme...
關於C 智慧型指標的一點認識
背景 預設的c 拷貝與賦值建構函式實現的是值拷貝傳遞。當類的資料成員為指向堆上的指標時,值拷貝會使多個類的指標指向同一塊記憶體。當其中乙個類釋放這塊記憶體時,會照成其他類的這個指標空懸,從而引來風險。智慧型指標是用來解決這類問題的方法。它最終的目的是讓多份指標安全地指向同一塊記憶體。要做到這一點,這...