怎么理解指針的指針?其實(shí)這個(gè)概念并不難,只是把它放到實(shí)際應(yīng)用中,容易造成困擾。
指針的指針還得先從指針講起。
先有一個(gè)變量,假設(shè)它是整型,在系統(tǒng)中占 4 個(gè)字節(jié)。
int a;
內(nèi)存是以字節(jié)為單位,每個(gè)字節(jié)都有一個(gè)地址,所以變量 a 占了4個(gè)地址。

在C語(yǔ)言中,描述變量 a 的地址,一般取最前面的這個(gè)字節(jié),所以 a 的地址是 0x100。
為了方便計(jì)算,很多時(shí)候我們想把 0x100 保存下來(lái),于是又需要一個(gè)變量,這個(gè)變量就是指針變量。指針的大小跟環(huán)境有關(guān)系,這里假設(shè)占 4 個(gè)字節(jié)。用代碼來(lái)表示,可以寫(xiě)成:
int *p = &a;
我們也經(jīng)常說(shuō),指針 p 指向變量 a。

既然 p 在內(nèi)存中占了 4 個(gè)字節(jié),那他肯定也有個(gè)地址,假設(shè)這個(gè)地址是 0x1000,如果想把 0x1000 保存下來(lái),那就需要指針的指針。
指針的指針也屬于指針,所以在內(nèi)存中也占 4 個(gè)字節(jié)。
如果用代碼來(lái)表示,可以寫(xiě)成:
int **q = &p;
q是個(gè)指針,指向變量 p,因?yàn)?p 本身也是個(gè)指針,所以就把 q 稱作指針的指針。
雖然 q 和 p 都是指針,但是也不能隨便賦值,比如能不能寫(xiě)成:
q = &a;
q是指針,&a是地址,地址賦值給指針,簡(jiǎn)直完美。
這個(gè)代碼完全行不通,因?yàn)?q 是 int ** 類型,它只能指向 int *類型的變量,比如 p 就是 int * 類型的變量,而 a 是 int 類型的變量。
關(guān)于指針的指針,有個(gè)極其經(jīng)典的筆試題,如果你刷過(guò)題,那你一定會(huì)遇到。

這個(gè)題目問(wèn)題就出在實(shí)參和形參是兩塊不同的內(nèi)存,malloc申請(qǐng)的內(nèi)存,地址記在了形參中,對(duì)實(shí)參沒(méi)有任何的影響,所以在主函數(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語(yǔ)言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145598 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71851 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29506
原文標(biāo)題:怎么理解指針的指針?
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
函數(shù)指針和指針函數(shù)的概念
指針的用法總結(jié),指針用法大全
c語(yǔ)言函數(shù)指針定義,指針函數(shù)和函數(shù)指針的區(qū)別
為什么使用指針?C++中的“指針”
輕松理解C語(yǔ)言指針的實(shí)驗(yàn)和詳細(xì)資料說(shuō)明
如何輕松理解C語(yǔ)言指針的詳細(xì)資料說(shuō)明
C語(yǔ)言指針的理解使用
二級(jí)指針和多級(jí)指針的定義形式
指針是什么
面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組
怎么理解指針的指針?
評(píng)論