1 移位(占內(nèi)存,移植性一般) 2 強(qiáng)制轉(zhuǎn)換(方便,移植性差) 3 宏定義(易讀,移植性好) #define ToByte(x, i) (((char*)(&x))[i]) 4 聯(lián)合體 union 5 聯(lián)合體+宏定義 #define value value.dw 剛剛在討論字節(jié)序的問題的時候出現(xiàn)了這么一個問題,怎么訪問一個整型變量里面的各個字節(jié),我們知道,如果要訪問這個整型最低地址一個字節(jié)的數(shù)據(jù)的話,可以通過如下方式: char a = *(char*)&整型變量名; 這里先將整型數(shù)通過取地址符號獲得變量的開始的地址,為什么要(char*)進(jìn)行強(qiáng)制類型轉(zhuǎn)換呢,因為對于整型數(shù)據(jù)的話,表示的就是以首地址開始的4個字節(jié),它是一個整體,取它的地址后,地址對應(yīng)的類型為int*類型,即如果通過這個指針訪問的話,只能訪問到整個4個字節(jié)的空間的數(shù)據(jù),沒法訪問單個字節(jié)。通過(char*)就將int*整型指針類型轉(zhuǎn)換為字符型指針類型。這樣就可以訪問低地址這個字節(jié)的數(shù)據(jù)啦。那么如果我想訪問第2個,第3個,第4個字節(jié)的數(shù)據(jù)呢。我們先來看看以下表示: char * pc = (char*)&整型變量名; pc現(xiàn)在指向首字節(jié),要訪問下個字節(jié)只需要*(p+1)就可以(即p[1]),同理下一個*(p+2)、*(p+3)(p[2]、p[3])。那如果我們不進(jìn)行指針轉(zhuǎn)換呢。我們看如下表示: int * pi = &整型變量名; 這個時候用*pi將獲得四個字節(jié)的內(nèi)容。pi+1將指向下一個整型地址空間,即0x0005地址,所以*(pi+1)(即pi[1])將訪問0x0005地址開始的四個字節(jié)的內(nèi)容。這里有點(diǎn)需要強(qiáng)調(diào)的是,*(pi+i)總是等于pi[i]。整個過程如下圖所示: 圖一:指針加1的差別 通過上面的分析,想獲得一個整型數(shù)里面的某個字節(jié)的值的話,我們可以如下表示: char a = ((char*)&整型變量名)[i]; i=0表示首字節(jié),1表示第2個字節(jié),依次類推。 |
|
來自: 新用戶79878317 > 《C 》