offset巨集的講解

2021-06-20 16:58:30 字數 1469 閱讀 1774

#define offsetof(type, member) ((size_t) &((type*)0)->member)

對這個巨集的講解我們大致可以分為以下4步進行講解: 1

>

( (type *)0 ) 

0位址強制"轉換

" 為type

結構型別的指標;

2>

((type *)0)->member   

訪問type

結構中的

member

資料成員;

3>

&( ( (type *)0 )->member)

取出type

結構中的資料成員

member

的位址;

4>

(size_t)(&(((type*)0)->member))

結果轉換為

size_t

型別。巨集

offsetof

的巧妙之處在於將

0位址強制轉換為

type

結構型別的指標,

type

結構以記憶體空間首位址

0作為起始位址,則成員位址自然為偏移位址。可能有的讀者會想是不是非要用

0呢?當然不是,我們僅僅是為了計算的簡便。也可以使用是他的值,只是算出來的結果還要再減去該數值才是偏移位址。來看看如下的**:

#include

#defineoffsetof(type, member) ((size_t) &((type *)4)->member)

struct test_struct ;

int main(void)

執行結果為:

jibo@jibo-virtualbox:~/cv_work/work/list/offset $ ./main

offsetof (struct test_struct,num) =0

offsetof (struct test_struct,ch) =4

offsetof (struct test_struct,f1) =8

為了讓大家加深印象,我們在**中沒有使用

0,而是使用的

4,所以在最終計算出的結果部分減去了乙個

4才是偏移位址,當然實際使用中我們都是用的是0。

#include

#defineoffsetof(type, member) ((size_t) &((type *)0)->member)

struct test_struct ;

int main(void)

執行結果為:

jibo@jibo-virtualbox:~/cv_work/work/list/offset $ ./main

offsetof (struct test_struct,num) =0

offsetof (struct test_struct,ch) =4

offsetof (struct test_struct,f1) =8

C C 巨集講解

眾多c 書籍都忠告我們c語言巨集是萬惡之首,但事情總不如我們想象的那麼壞,就如同goto一樣。巨集有 乙個很大的作用,就是自動為我們產生 如果說模板可以為我們產生各種型別的 型別替換 那麼巨集其實可以為我們在符號上產生新的 即符號替換 增加 關於巨集的一些語法問題,可以在google上找到。相信我,...

C,C 巨集中 與 的講解

文中 file 與示例1的可以參見 使用ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...

C,C 巨集中 與 的講解

文中 file 與示例1可以參見 使用 ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...