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