1、先把問(wèn)題擺出來(lái)
參考Demo:
1#include
運(yùn)行結(jié)果:
現(xiàn)象描述:
大家可以看到當(dāng)試圖輸出**((int **)ptr)的時(shí)候程序奔潰了,其實(shí)在bug菌剛開(kāi)始學(xué)習(xí)C的時(shí)候也是遇到了這個(gè)問(wèn)題,最終理解清楚了就自然明白了。粗暴點(diǎn)就把((int **)ptr);*((int **)ptr);**((int **)ptr)都嘗試著打印出來(lái)分析分析。
所以bug菌在下面把指針的一些知識(shí)點(diǎn)都跟大家講解一下,形成系統(tǒng)的知識(shí),避免一些小伙伴僅學(xué)習(xí)了一些碎片而一知半解。
2、二級(jí)指針的使用
1
多級(jí)指針 其實(shí)多級(jí)指針在嵌入式程序中的應(yīng)用還是相對(duì)比較少的,超過(guò)3級(jí)的bug菌僅僅只在一個(gè)特殊的索引功能里面使用過(guò)。 這里重點(diǎn)看看一、二級(jí),畢竟二級(jí)指針與我們的二維數(shù)據(jù)結(jié)合使用,二維素組在圖形、矩陣、算法等等方面還是使用非常廣泛的。
2
一級(jí)指針 指針其實(shí)廣義的講它也是一種數(shù)據(jù)類型,所以所謂的int* ptr;其中int* 就是變量ptr的類型,那么ptr就是我們常說(shuō)的指針變量。
Demo:
1#include
運(yùn)行結(jié)果:
圖解:
分析一下:
ptr既然是變量,變量存于內(nèi)存中,那么就一定有其地址,如上圖所示ptr位于0x28FEE8地址處,其中其ptr里面保存的就是藍(lán)色區(qū)域中的地址,也就是a變量所在的地址,所以&a與ptr是相等的。
*ptr就很好理解了,你可以把*ptr看成一個(gè)變量,其類型為int,其變量位于ptr值所在的內(nèi)存地址處,即0x28FEEC處的int變量與定義的int a剛好一致。
3
二級(jí)指針 如果大家已經(jīng)理解了一級(jí)指針,二級(jí)指針也就順理成章了,來(lái)看看下面的小程序:
Demo:
1#include
運(yùn)行結(jié)果:
圖解:
分析一下:
通過(guò)上圖來(lái)看ptrptr也是一個(gè)變量,其類型為int**,變量肯定有內(nèi)存,其地址就是0x28FEE4,其變量保存的值是0x28FEE8(即ptr的地址)。
那么*ptrptr,同樣跟一級(jí)指針一致,把*ptrptr看成一個(gè)變量,也就是在ptrptr的值0x28FEEC8地址處的一個(gè)int*類型的變量,且該變量的值是0x28FEEC,其自身的地址為0x28FEE8。
同樣對(duì)于**ptrptr也看成變量,也就是*ptrptr的值0x28FEEC地址處的一個(gè)int類型的變量,那么此時(shí)該變量與a是相等的。
最后在解釋一下&*ptrptr,由于*ptrptr一個(gè)變量,&*ptrptr表示該變量的地址即0x28FEE8,然而該值剛好也是ptrptr變量的值,所以&*ptrptr =ptrptr。
3、是時(shí)候解答前面的問(wèn)題了
參考Demo:
1#include
分析一下:
我們知道問(wèn)題出在**(int**)ptr,不太理解的小伙伴總是覺(jué)得,我已經(jīng)強(qiáng)制類型轉(zhuǎn)化為二級(jí)指針了,前面只需要用**獲得最后的值即可,怎么就不行呢? 我知道這里有問(wèn)題我就是不理解為什么?
那我們一起通過(guò)前面的知識(shí)來(lái)分析分析。同樣把ptr看成是變量,變量的值并不會(huì)跟隨強(qiáng)制類型而發(fā)生改變。強(qiáng)制類型僅僅只是改變了獲取內(nèi)存中數(shù)據(jù)的方式,并沒(méi)有改變內(nèi)存中的數(shù)據(jù)。下面圖解一下:
所以本例子中對(duì)于強(qiáng)制類型轉(zhuǎn)化中的**(int*****)ptr,無(wú)論強(qiáng)制類型轉(zhuǎn)化為幾級(jí)指針都沒(méi)有絲毫意義,因?yàn)樽兞勘旧淼闹禌](méi)有發(fā)生變化!所以強(qiáng)制類型轉(zhuǎn)化以后第二個(gè)*便會(huì)指向出問(wèn)題,從而導(dǎo)致訪問(wèn)了不正確的內(nèi)存空間而程序奔潰。
多級(jí)指針強(qiáng)制類型轉(zhuǎn)化的目的大部分都是為了滿足編譯器檢查指針層級(jí)操作邏輯是否有誤。
以后大家對(duì)于多級(jí)指針的分析不太熟練的話可以跟bug菌一樣畫(huà)畫(huà)圖分析分析,基本上一些理解上的問(wèn)題就迎刃而解了。
4、最后小結(jié)
指針的理解就為大家講解到這里了,如果你對(duì)指針還有畏懼感,那就只有一個(gè)可能,使用得太少了,多加練習(xí)自然生巧!
-
算法
+關(guān)注
關(guān)注
23文章
4587瀏覽量
92501 -
矩陣
+關(guān)注
關(guān)注
0文章
418瀏覽量
34475 -
嵌入式程序
+關(guān)注
關(guān)注
0文章
6瀏覽量
6523
原文標(biāo)題:C進(jìn)階技巧:二級(jí)指針這個(gè)問(wèn)題被問(wèn)好幾遍!該終結(jié)了!
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論