如果你不太清楚int *和char *的區(qū)別,看完這道題,可能就會(huì)有所感悟。
一個(gè)字符數(shù)組a,初始化成:
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 然后定義三個(gè)指針,分別是:
short * int * int64 *這里把 int64 理解成 8 個(gè)字節(jié)的整數(shù)就行,不用管它是不是真的存在。
三個(gè)指針都初始化成數(shù)組名a,也就是數(shù)組第一個(gè)元素的地址,假設(shè)數(shù)組首元素地址是 0x100,那三個(gè)指針的值都是 0x100。
如果畫出來,就是這樣的。
下面就要來搞清楚 short * 和 int * 的區(qū)別。
所謂short *,表示一個(gè)指針,指向的是short類型的數(shù)據(jù)。在32位系統(tǒng)中,short類型占2字節(jié),所以指針指向的是這兩個(gè)字節(jié)。如果讓指針加一,它也會(huì)跳過兩個(gè)字節(jié)。
同理,如果是int *類型,也表示一個(gè)指針,指向int類型的數(shù)據(jù),在32位系統(tǒng)中,int類型占4字節(jié),所以指針指向的是這4個(gè)字節(jié),如果讓指針加一,他也會(huì)跳過4個(gè)字節(jié)。
再回到數(shù)組上,因?yàn)槿齻€(gè)指針類型不同,所以指向的數(shù)據(jù)長度也不同。
接下來就是取值操作。
*p1就是取指針 p1 指向內(nèi)存的值,但是并不能簡單的認(rèn)為結(jié)果是0x0102。也有可能是0x0201。
還好題目一開始說了,32位系統(tǒng),小端字節(jié)序。
所謂小端,就是高地址保存高字節(jié)。
在數(shù)組里面,下標(biāo)為 0 的元素一定是低地址,所以01應(yīng)該就是低字節(jié)。
于是 *p1 是 0x0201。
*(p1 + 2)應(yīng)該會(huì)跳過4個(gè)字節(jié),剛才說了,short *類型的指針,加一會(huì)跳過2個(gè)字節(jié)。所以*(p1 + 2)的結(jié)果是0x0605。
p3因?yàn)橹赶蛄?個(gè)字節(jié),所以*p3是0x0807060504030201。
最后一個(gè)*(p2 + 2),p2是int類型的指針,加2跳過了8個(gè)字節(jié),表示的是最后4個(gè)字節(jié)的地址,取值的結(jié)果就是0。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6898瀏覽量
88833 -
數(shù)組
+關(guān)注
關(guān)注
1文章
416瀏覽量
25910
原文標(biāo)題:從面試題入手,分析不同指針類型的區(qū)別
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論