你真的了解二級指針嗎?
?????????????????????????????????????????????????????????????????作者:嵌入式小報(bào)
什么是指針?
????????大家對指針應(yīng)該都熟悉了吧?指針變量存儲的是個指向某個數(shù)據(jù)類型地址變量。char 類型的指針變量(如地址0x0a里面存放著地址變量0x0b)內(nèi)容指向的數(shù)據(jù)類型是char、Int類型的指針變量內(nèi)容指向int類型的數(shù)據(jù)。如圖1所示綠色框內(nèi)藍(lán)色箭頭(0x0a)指向目標(biāo)數(shù)據(jù)框(藍(lán)色框)表示目標(biāo)數(shù)據(jù)的地址(藍(lán)色框內(nèi)的內(nèi)容就是目標(biāo)數(shù)據(jù)地址0x0b)。struct 類型(聚合類型數(shù)據(jù))的指針變量指向聚合類型數(shù)據(jù)類型的首地址如圖2所示。綠色框內(nèi)藍(lán)色箭頭表示指針變量存儲的值,指向目標(biāo)數(shù)據(jù)的框頂表示目標(biāo)數(shù)據(jù)的首地址。(指針類型強(qiáng)制轉(zhuǎn)換除外)

來個例子:例如??

????????但是指針變量在32為系統(tǒng)中不管指向哪種類型的數(shù)據(jù)均只占有四個字節(jié),這四個字節(jié)存儲的值是指向所指向數(shù)據(jù)單元的的地址,結(jié)構(gòu)體等聚合類型指向的是聚合類型數(shù)據(jù)的首地址。(這里說的是一級指針哦)
注意上圖
?

????????從圖4仿真就可以看到指向結(jié)構(gòu)體類型的指針變量指向的是目標(biāo)結(jié)構(gòu)體首地址。
何為二級指針?
二級指針就是指針套指針,如圖5所示

????????第一個綠色框內(nèi)藍(lán)色箭頭表示指針變量里面存儲著第二個綠色框指針變量的地址,第二個綠色框內(nèi)存儲的地址值才是目標(biāo)數(shù)據(jù)的地址。那我們?nèi)绾稳ト《壷羔樌锩娴膬?nèi)容呢?直接上例子。如圖6所示
?

????????以一個一維數(shù)組為例,將它作為二級指針來用,我們知道指針就是表示的地址值(所以是無符號的整數(shù)哦,沒那個計(jì)算機(jī)什么地址是負(fù)數(shù)吧),形參是二級指針,數(shù)組明就是個地址(圖5第二個框),為了與形參類型相互匹配所以取數(shù)組明的地址(圖5第一個框),形參是void **這樣的接收方式,多以將數(shù)組名的地址強(qiáng)制轉(zhuǎn)化為void*。
再來看接收打印函數(shù), 32為系統(tǒng)的指針是4字節(jié),也就是圖5第一個框存儲的數(shù)據(jù)必須輸4字節(jié)的地址變量,所以先將void* 轉(zhuǎn)換為(unsigned int *)或者 (unsigned char *)。如圖7所示:
?

????????0x2000042C 是pdata的首地址,如果把void* 轉(zhuǎn)換為(unsigned char *),地址就是四個字節(jié)的拼湊和unsigned char *)是一樣的,畢竟指針變量占據(jù)4個字節(jié)嘛。因此我先把void*轉(zhuǎn)換為正確的指針形式之后,也就是正確到達(dá)圖5的第二個框,也就是要指向的目標(biāo)數(shù)據(jù)的框,接下來按照你的定義的所指向目標(biāo)數(shù)據(jù)類型轉(zhuǎn)換就行了(此處一定要是所要指向的數(shù)據(jù)類型)。
總結(jié):指針變量存儲的是個指向某個數(shù)據(jù)類型地址變量。二級指針就是指針套指針,如果指針類型確定取數(shù)據(jù)就是多一個*的問題,如果是 void ** 首先要轉(zhuǎn)化為(unsigned int *)或者 (unsigned char *)取出第二個指針的內(nèi)容才能進(jìn)行后面的操作!
今天的內(nèi)容就分享到這里了,記得分享加關(guān)注哦??!謝謝各位看官!
??
