關於偏移量的理解

2021-10-02 14:58:43 字數 1464 閱讀 2875

偏移量是個很神奇的東西,好多學科,好多方面都包含有他的知識。今天主要是想和大家分享一下自己關於偏移量的理解,以新手向為主的理解,那麼當然是言簡意賅,然後作為拋磚引玉之用吧,希望能有各路大神來補充說明。

產生靈感的**主要來自於**呢?今天接觸了一些關於雙向迴圈鍊錶的東西,用老師的話講叫做「火車皮拉貨」,在lxr上面的定義有些繞口,但是畫圖以後就能清楚的看到,以前接觸的鍊錶,形象比喻叫做「把車皮和貨物綁在一起」,

而現在叫做「火車拉貨」,

怎麼取都可以哦!

再加上他的靈活性,乙個節點可以同時存在於兩個連表中,很好玩啊!這樣的話不是什麼東西都可以連線在一起了嗎?

那麼接下來就講到偏移量了。熟悉基礎和計算機的大神們當然知道偏移量的原理和作用,下午的時候我就是糾結於「偏移量是幹什麼的」這個問題。

那麼首先簡單說說偏移量這個東西。就拿container_of這個傢伙來說說吧。

#define container_of(ptr, type, member) ()

typeof是取當前變數的型別,那麼看那個括號裡,是強制轉化為了指標,然後由ptr將mptr初始化。ptr呢就作為乙個結構體中的指標定義並初始化了。

既然是指標那麼我們便可以取到他的位址,而下面的offsetof便是偏移量了。用指標的位址減去偏移量即是結構體開頭所在。

為什麼要找到結構體的開頭呢?

舉個例子:假設你要去火車上的某個位置找乙個人,而那個人具體在**你並不知道,只能通過檢視火車頭上提供的座位資訊才能確認的話,那麼你的首要任務就是先找到火車頭,確認你要找的火車車廂,然後才能找到你想要找的人。放在結構體裡面來看的話,你就好比是那個ptr,那個已知知位置的指標,而你從現在所在位置到達火車頭所走過的距離就是偏移量。

有人可能會問,為什麼我要走這個偏移量呢?開始的時候我也不明白,朋友告訴我是因為讀取資料的規定要求這樣做。但是後來我想通了。

原因其實也很簡單,作為計算機,他所能識別的語言只有「0」、"1",而它存放的資料也是連續的,這和他的構造也有一定的關係。如果我們把乙個結構體看作是乙個裝滿資料的小盒子的話,即便是我們知道要找的資訊在盒子裡,我們也只能是通過從頭到尾遍歷查詢的方式確認資訊到底在什麼地方。而因為我們開始並不知道ptr指標在資料盒子所處的相對位置,因此我們需要確定他的具體位置所在。亦或是我們知道了要找的資料大致在什麼位置,也得首先確定資料頭的位置,才能夠確定出資訊具體的位置所在。

這個用火車的例子也能夠說明白。我們可能知道要找的人大致在哪個車廂,但是我們現在所在的位置並不是確定的,因此為了確保位置的準確性,我們需要找到火車頭,但後在一節節車廂或者是確定到某個車廂來找到我們需要找到的人。

指標偏移量的理解

今天刷題的時候碰到如下的一道題 int main array 19 2019 unsigned long offset unsigned long short array 2019 unsigned long array unsigned char array 19 cout offset 以上程式...

檔案指標偏移量

f.seek offset,whence offset代表檔案的指標的偏移量,單位是位元組bytes whence代表參考物,有三個取值 0 參照檔案的開頭 1 參照當前檔案指標所在位置 2 參照檔案末尾 ps 快速移動到檔案末尾f.seek 0,2 強調 其中whence 1和whence 2只能...

c point偏移 c 偏移量分頁效果

分頁效果對程式設計師來所是常見的,但是在這裡我介紹的是乙個不一樣的分頁效果,也許你們也長用,偏移量的分頁效果,以前學的不精所以研究一好久覺得還是拿出來分享一下吧,同時也讓我記住。好了光說大家可定沒興趣,來個效果圖吧 這個效果想必大家不陌生吧。先介紹一下偏移量的思路吧,也方便我以後好記起,呵呵私心哈,...