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