目的 獲取乙個結構體成員相對於該結構首位址的偏移量

2021-10-01 01:43:07 字數 1251 閱讀 7074

c**如下:

#include

#define get_offset(data,member)      (size_t)(&(((typeof(data)*)0)->member))

typedef struct studentstudent_t;

int main(int argc, char const *ar**)

**分析如下:

1. typeof 關鍵字: 

用於獲取修飾修飾變數的資料型別。比如 int value; typeof( value ) 的作用是獲得 value 的資料型別int 。

用法: 

int value; 我想要定義乙個 和value這個變數型別一樣的新變數new_value ; 

操作像這樣: typeof(value) new_value ;

該用法可以用在函式的值傳遞中,在不知道值的型別的時候,可以定義和它型別相同的新變數。

2. typedef :

為資料型別起乙個名字 :比如 typedef struct student student_t ;

約定 :一般新名字後面以 _t 結尾,表示是乙個構造出來的新型別名字,便於理解。

student_t stud1 ; 等價於 struct student stud1 ; 很顯然 前者更有利於移植和閱讀。

3. ((data_type *)0) : 

作用:把數字 0 強制轉換成 (data_type) 型別的指標。

比如:( struct student * )0 的作用是把 0 轉換成 struct student型別的指標,用於引用struct student資料型別型別的成員。

在這個題目中: ((typeof(data)*)0)->member 的目的是 把 0 轉成 data 變數對應的資料型別的指標,然後通過該指標引用該型別的成員的值。

對於本題而言: (size_t)(&(((struct student *)0)->d)) : & 用以獲取struct student結構的成員d ,然後,獲得d 的位址,將它轉成 size_t 的資料型別量。

其中 size_t 的定義是 typedef unsigned int size_t ;

(size_t)(&(((struct student *)0)->d)) 它的值是變數d的位址,為什麼是偏移值呢? 因為 起始位址我們認為規定為 0。

4. size_t :

typedef unsigned int size_t ; 

1目的:便於不同系統之間的移植

取得URL相對於另乙個URL的相對路徑

今天群裡灰大出了個題 1 function getrelativeurl url,baseurl 用了點時間寫了一下 1 function getrelativeurl url,baseurl 7 r 8 domain a za z.9 port d 10 word g,11 1213 compar...

從乙個成員得到結構體的位址

container of巨集 define offset of type,member size t type 0 member type 結構名 member type 結構中的成員 type 0 告訴編譯器有乙個指向 type 結構的指標,其值為止0 type 0 member 取結構 type...

判斷乙個點相對於三角形的位置(借助向量)

如圖,點p在三角形abc內部,可以通過以下三個條件判斷 點p和點c在直線ab同側 點p和點b在直線ac同側 點p和點a在直線bc同側 如果以上三個條件同時滿足,則點p在三角形abc內部。下面將會用到叉乘這個數學工具來確定乙個點在直線的哪一側。三角形的三個頂點是轉著來的,算一次就行了。比如,在上圖中,...