怎么理解指針的指針?其實這個概念并不難,只是把它放到實際應(yīng)用中,容易造成困擾。
指針的指針還得先從指針講起。
先有一個變量,假設(shè)它是整型,在系統(tǒng)中占 4 個字節(jié)。
int a;
內(nèi)存是以字節(jié)為單位,每個字節(jié)都有一個地址,所以變量 a 占了4個地址。
在C語言中,描述變量 a 的地址,一般取最前面的這個字節(jié),所以 a 的地址是 0x100。
為了方便計算,很多時候我們想把 0x100 保存下來,于是又需要一個變量,這個變量就是指針變量。指針的大小跟環(huán)境有關(guān)系,這里假設(shè)占 4 個字節(jié)。用代碼來表示,可以寫成:
int *p = &a;
我們也經(jīng)常說,指針 p 指向變量 a。
既然 p 在內(nèi)存中占了 4 個字節(jié),那他肯定也有個地址,假設(shè)這個地址是 0x1000,如果想把 0x1000 保存下來,那就需要指針的指針。
指針的指針也屬于指針,所以在內(nèi)存中也占 4 個字節(jié)。
如果用代碼來表示,可以寫成:
int **q = &p;
q是個指針,指向變量 p,因為 p 本身也是個指針,所以就把 q 稱作指針的指針。
雖然 q 和 p 都是指針,但是也不能隨便賦值,比如能不能寫成:
q = &a;
q是指針,&a是地址,地址賦值給指針,簡直完美。
這個代碼完全行不通,因為 q 是 int ** 類型,它只能指向 int *類型的變量,比如 p 就是 int * 類型的變量,而 a 是 int 類型的變量。
關(guān)于指針的指針,有個極其經(jīng)典的筆試題,如果你刷過題,那你一定會遇到。
這個題目問題就出在實參和形參是兩塊不同的內(nèi)存,malloc申請的內(nèi)存,地址記在了形參中,對實參沒有任何的影響,所以在主函數(shù)中,實參一直是空,把字符串拷貝進去,就會出現(xiàn)段錯誤。
void init_memory(char **s) { *s = malloc(128); } int main() { char *str = NULL; init_memory(&str); strcpy(str, "helloworld"); return 0; }修改的方法就是傳指針 str 的地址,形參改成指針的指針,于是就出現(xiàn)了 s 指向 str,*s 就是 str,執(zhí)行init函數(shù),str從NULL變成了一個合法的地址,程序就能順利運行。
審核編輯:劉清
-
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135861 -
指針
+關(guān)注
關(guān)注
1文章
478瀏覽量
70491 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28306
原文標題:怎么理解指針的指針?
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論