今天刷題的時候碰到如下的一道題:
int main() ;
array[19] = 2019;
unsigned long offset = (unsigned long)((short*)array + 2019) - (unsigned long)(array + *(unsigned char*)(array + 19));
cout << offset;
}
以上程式的輸出是多少?仔細一看,這裡面各種指標操作,讓人一眼看去就有放棄的衝動。其實不急,按照一層一層的剝絲抽繭,其實也不是那麼難。
首先,對於((short*)array+2019)
中,是把array
指標由int
型指標強制轉換為short
型指標,再偏移2019個單位。short
型佔2個位元組,因而在位址上的偏移量就是2019 * 2 = 4038
;
然後,對於後面的*(unsigned char*)(array + 19)
進行分解:1、array+19
對應得是array[19]
的位址,這個位址儲存的數為2019,其寫成16進製為0x000007e3
,而(unsigned char*)(array + 19)
就是把這個位址轉換為unsigned char
型指標,由於char
型只佔1個位元組,因而其位址取出來的數只有原來的前1/4記憶體儲存的資料,即e3
,關於為什麼是e3
,而不是00
呢?這個放到下面說。所以,*(unsigned char*)(array + 19)
雖然是char型,但其轉換為數值為0xe3
,即227。之後再(unsigned long)(array + *(unsigned char*)(array + 19))
就相當於array位址偏移227個單元,偏移量為227 * 4 = 908
。因而輸出的offset = 4038 - 908 = 3130
。
關於上面為什麼是e3
,而不是00
呢?
這是因為在記憶體儲存中, 是按照位元組從低位到高位儲存的,測試如下:
int main
輸出為:
檔案指標偏移量
f.seek offset,whence offset代表檔案的指標的偏移量,單位是位元組bytes whence代表參考物,有三個取值 0 參照檔案的開頭 1 參照當前檔案指標所在位置 2 參照檔案末尾 ps 快速移動到檔案末尾f.seek 0,2 強調 其中whence 1和whence 2只能...
關於偏移量的理解
偏移量是個很神奇的東西,好多學科,好多方面都包含有他的知識。今天主要是想和大家分享一下自己關於偏移量的理解,以新手向為主的理解,那麼當然是言簡意賅,然後作為拋磚引玉之用吧,希望能有各路大神來補充說明。產生靈感的 主要來自於 呢?今天接觸了一些關於雙向迴圈鍊錶的東西,用老師的話講叫做 火車皮拉貨 在l...
C語言中的指標加減偏移量
首先看一段程式 輸出結果為 2,5 第乙個結果好說,a 1後指標指向了陣列中的 2 而第二個為什麼輸出 5 呢。原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。比如,int a int b a 1 則 b a sizeof int char a char b a 1 則b a size...