|
一、類型強(qiáng)制轉(zhuǎn)換 其實(shí)類型強(qiáng)制轉(zhuǎn)換并沒有修改原來存儲(chǔ)的值,也沒有對(duì)內(nèi)存做任何的修改,只不過說在取值的時(shí)候讀取數(shù)據(jù)的長(zhǎng)度不同,進(jìn)而產(chǎn)生了不同的結(jié)果。首先引入一個(gè)網(wǎng)上看到的程序:
運(yùn)行結(jié)果為: ![]() 通過上面的結(jié)果可以得到以下初步結(jié)論: 1. (void *)的存儲(chǔ)空間為4個(gè)字節(jié) 2. (int *)uData+1 等價(jià)于 uData+4 3. 小端存儲(chǔ)。一個(gè)字符數(shù)組轉(zhuǎn)換為一個(gè)short型的數(shù)據(jù)時(shí),原字符數(shù)組中數(shù)組索引越大,該值在short型中所處的位越高。例: cc[0]='4'. cc[1]='5',cOut=*(short*)cc,則cOut=0x0504(十進(jìn)制就是1284)。 針對(duì)上面的程序,實(shí)際上主要解釋一句:cOut=*(short *)((int *)uData+1); uData是一個(gè)char型數(shù)組的首地址,擴(kuò)展為一個(gè)指向int型數(shù)據(jù)的指針;指針加1的操作實(shí)際上是指針原來的值加上指針?biāo)鶎?duì)應(yīng)類型的字節(jié)數(shù)(這里是int,int在這里需要4個(gè)字節(jié))。所以,uData無論擴(kuò)展與否,其值都是2686682(一個(gè)隨機(jī)分配的起始地址,此時(shí)的*(int *)uData=0x00010203),指針加1操作后,變?yōu)?686686(此時(shí)的*((int *)uData+1)=0x0405060708)。此時(shí)該指針又進(jìn)行了一次強(qiáng)制轉(zhuǎn)換,變成一個(gè)指向short型數(shù)據(jù)的指針,最后將該指針的內(nèi)容賦給cOut。所以 cOut=0x0504(上面的結(jié)論三知道,數(shù)據(jù)是小端存儲(chǔ)的)。 二、指針強(qiáng)制轉(zhuǎn)換為指向指針的指針 看看下面的這段代碼:
其運(yùn)行的結(jié)果為: ![]() |
|
|