C/C++編程筆記:C語言結構體硬核玩法分享,一切皆是數據!

前言

對於結構體的應用太多了,今天這篇文章我主要爲你們總結平時關於結構體的一些獨特硬核小技巧,對於結構體更多優秀的編程表現,若是你對結構體的基礎知識還不具有的話得回頭看一下專欄教程或者本身找本書籍學習一下便可哦。linux

結構體:字面上的意思就是有着層次結構的一種數據形式,所謂的層次結構就是咱們在結構體中定義的各類成員了,再白話一點:結構體就是一個數據包,裏面能夠包含各類各樣的數據。對於這句話咱們還要深刻挖掘一下"各類各樣的數據」,對於咱們編程而言-「一切皆是數據」。進一步理解,結構體裏面能夠包括整個程序中你想包含的東西。若是這樣的推敲沒錯的話,那結構體還真有點東西了,畫個圖供你們揣摩,結構體的奇妙之處全在圖裏面了!算法

硬核小技巧之講究的初始化

咱們大部分初學的小夥伴通常都是直接對結構體變量直接進行初始化,(哈哈,可能不少小夥伴定了了變量根本就不會進行初始化)不過仍是要養成比較好的編程習慣,雖然如今大部分集成開發環境都會爲你們把一些全局變量初始化爲0,不過對於代碼的可移植性、可預知性考慮仍是建議既然定義了就要給一個初始狀態。編程

解析一下:上面是一個很是簡單的代碼,其中第一種結構體的初始化是linux源碼中很是常見的一種方式,這種初始化的方式編譯器必需要遵循ISO C99標準,不然只能使用第二種比較常規的方式,不過如今大部分編譯器都支持該標準因此也被比較廣泛的使用,其帶來的好處有幾點:1)對於結構體成員變量的初始化更加清晰,特別是當結構體特別大的時候;2)不用在意初始化的順序,只須要名字和數據對應上便可,很是的靈活。微信

硬核小技巧之講究的多重別名

當你進行C編程時間久了之後,對於所屬性一致的變量等你都會用結構體進行封裝,那麼可能出現同一個結構體可能多個地方使用的狀況,而且結構體的做用會有所不一樣,就好像一我的他多是一名學生,也有可能在外面兼職作一名服務員等等,若是這我的不穿一身衣服或者作個標記什麼的可能有時候咱們難以分辨,那麼在C程序裏面咱們會怎樣爲他們換個衣服呢?簡單代碼以下:函數

解析一下:上面的代碼確實挺簡單的,可能有些小夥伴一眼就能夠看懂,不過這種使用方法是很是有價值的,特別是之後你們玩算法,好比說:節點都是同樣的,不過節點分爲子節點和父節點,對於一些處理函數傳入的參數雖然是同樣的,不過意義卻不一樣,咱們就能夠經過這樣的方式進行處理,從而增長代碼可讀性。學習

硬核小技巧之講究的0地址

這一塊的內容算是這篇文章的最硬核的內容,各位小夥伴們要作好筆記了,深刻學習C語言的一種方式就是多讀讀大佬們的代碼,而且善於總結一些經常使用的小技巧供你們平時使用,今天就拿Linux的kernal中的兩個宏定義來分享幾個結構體小技巧:spa

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)指針

#define container_of(ptr,type, member) ({ \blog

consttypeof( ((type*)0)->member ) *__mptr = (ptr); \教程

(type*)( (char *)__mptr - offsetof(type,member) );})

解析一下:

第一個宏定義的功能是得到一個結構體成員距離結構體首地址的偏移量,參數TYPE : 結構體類型;參數MEMBER : 結構體成員,其實這個算是比較簡單的,把0地址強制類型轉化爲結構體類型指針,而後經過結構體指向成員便可得到結構體成員變量,而後經過&進行取地址便得到告終構體成員地址,成員的偏移 = (結構體成員地址 - 結構體首地址);然而結構體首地址爲0,這樣成員的偏移 = 結構體成員地址,應該足夠清楚了吧。

第二個宏定義的功能是經過結構體成員變量得到對應的結構體首地址(也就是結構體地址),參數ptr :結構體成員變量地址;參數type : 結構體類型;參數member :結構體成員,這個宏定義可能對於一些小夥伴而言在寫法上有一點點難度,不過其主要分兩部分,第一部分經過typeof得到成員的類型並定義了一個const指針,定義爲const的目的是不讓用戶對0地址的內容進行寫操做,對於大部分芯片對不合法區域進行讀寫會引發異常。第二部分經過使用offsetof宏定義得到結構體成員相對結構體首地址的偏移,這樣一相減便得到了當前結構體成員所屬結構體的地址,原理公式:(結構體地址 = 結構體成員地址 - 結構體成員的偏移)。

這裏大致說一下注意事項 : 在第二點咱們談到了typeof關鍵字,該關鍵字是GUN C標準中擴展的關鍵字,因此在使用該宏定義的時候須要注意一下,否則採用其餘標準進行編譯可能會報錯。

但願對你們有幫助!


自學C/C++編程難度很大,若是你想更快提高本身的編程能力和編寫項目的水平,歡迎一塊兒共同成長!

C語言C++編程學習交流圈子,QQ羣【757874045點擊進入微信公衆號:C語言編程學習基地

有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!

相關文章
相關標籤/搜索