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