指標偏移量的理解

2022-07-17 16:54:17 字數 1392 閱讀 7218

今天刷題的時候碰到如下的一道題:

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...