91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言之offsetof宏和container_of宏

發布時間:2020-07-10 23:03:05 來源:網絡 閱讀:1019 作者:菜鳥養成記 欄目:編程語言

  首先我們要明白一點通過結構體變量來訪問結構體中的各個元素時,其本質上是

通過指針的方式來實現訪問的,只不過是這個時候編譯器幫自動幫我們計算了每個

元素與結構體起始地址之間的偏移量而已


一:offsetof宏:

#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

1:參數與返回值分析:

 (1)TYPE是結構體類型,MEMBER是結構體中一個元素的元素名

  (2)這個宏返回的是member元素相對于整個結構體變量的首地址的偏移量,類型是int

2:作用于原理

  (1)offsetof宏的作用是:用宏來計算結構體中某個元素和結構體首地址的偏移

量(其實質是通過編譯器來幫我們計算)。

  (2)offsetof宏的原理:我們虛擬一個type類型結構體變量,然后用type.member

的方式來訪問那個member元素,繼而得到member相對于整個變量首地址的偏移量。

3:從結合方式方面來分析:

(TYPE *)0 這是一個強制類型轉換,把0地址強制類型轉換成一個指針,這個指針指

向一個TYPE類型的結構體變量。 (實際上這個結構體變量可能不存在,但是只要我

不去解引用這個指針就不會出錯)。


((TYPE *)0)->MEMBER (TYPE *)0是一個TYPE類型結構體變量的指針,通過指針指針

來訪問這個結構體變量的member元素


&((TYPE *)0)->MEMBER  等效于&(((TYPE *)0)->MEMBER),意義就是得到member元

素的地址。但是因為整個結構體變量的首地址是0,所以得到的member元素的地址就

是member元素的偏移量。


二:container_of宏

#define container_of(ptr, type, member) ({\
const typeof(((type *)0)->member) * __mptr = (ptr);\
(type *)((char *)__mptr - offsetof(type, member)); }
注意:這里的 \ 是連行符

1:參數與返回值分析:

 (1)ptr是指向結構體元素member的指針,type是結構體類型,member是結構體

中一個元素的元素名

 (2)這個宏返回的就是指向整個結構體變量的指針,類型是(type *)

2:作用與原理分析:

  (1)作用:知道一個結構體中某個元素的指針,反推這個結構體變量的指針。有

了container_of宏,我們可以從一個元素的指針得到整個結構體變量的指針,繼而

得到結構體中其他元素的指針。

  (2)typeof關鍵字的作用是:typepof(a)時由變量a得到a的類型,typeof就是由

變量名得到變量數據類型的。

  (3)這個宏的工作原理:先用typeof得到member元素的類型定義成一個指針,然

后用這個指針減去該元素相對于整個結構體變量的偏移量(偏移量用offsetof宏得

到的),減去之后得到的就是整個結構體變量的首地址了,再把這個地址強制類型

轉換為type *即可。













向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡族自治县| 德阳市| 大竹县| 玉门市| 崇文区| 三都| 新宁县| 永新县| 大洼县| 盐山县| 彭阳县| 双鸭山市| 江油市| 青冈县| 综艺| 个旧市| 泗洪县| 娄底市| 外汇| 同江市| 烟台市| 通城县| 博客| 马关县| 安多县| 渭南市| 历史| 大渡口区| 剑川县| 文登市| 延吉市| 天等县| 扶余县| 呼和浩特市| 五寨县| 合作市| 西畴县| 祁门县| 玉树县| 武穴市| 藁城市|