linux C 中重要的數據結構——結構體

        如大家所知,Linux kernel是由C語言和少部分彙編實現的,如此龐大的系統,要用面向過程的C語言來實現,怎樣才能保證系統組織的清晰與正確性?其實,雖然C語言沒有封裝對象這種數據結構,但是他卻有個更靈活的東西——機構體。這傢伙身經百戰,能屈能伸,應對了所有需要對象出場的情況,在內核中隨處可見,就是由他來扮演着對象的角色。


         結構體,顧名思義,就是結構化的來組織一些數據結構,那麼對象是要封裝數據和操作的,只用來組織數據結構,那函數呢?你忽略了C語言的強大在於它的指針,熟練的應用指針能給程序帶來數量級的效率的提升。但他的不安全又是java棄之而去的本源。指針是C的基本數據結構之一,而struct就是用來組織基本數據結構使之形成滿足應用需求的封裝結構體的,當然可以包含指針元素,另外,c又是支持函數指針的,那麼,struct沒有理由不可以包含函數指針,所以,struct通過包含函數指針的形式封裝了數據相關的操作,從而完成了在C語言層面對“對象”這一數據結構的抽象。真的很強大。


           好的,知道了結構體的牛X,就要掌握它的應用,我們的目標就是去掌握最牛X的東西,從而使得自己也牛X起來。縱使我們現在還是小白、小菜,積累的多了,沉澱的就多了。小白還會抓小雞雞、小菜也會茁壯成長……那麼struct還是有一些應用技巧的,因爲是對基本數據結構的組織和封裝,而數據結構,數據麼,就要牽涉到內存,就要牽涉到內存的分配。而內存的分配就會涉及到對齊,爲了讓我們的程序達到最優,這個struct中的字節對齊問題你必須要瞭解一些:

你學要看這篇文章》》》》》【字節對齊】 ,一定要看,不看是你的損失。


         下邊是今天看博客時發現的一篇與struct有關的一些操作符的優先級問題,這個是不可多得的,必須提出來說明一下的下邊是內容:

【原文地址】


在所有運算符中,下面4個運算符的優先級是最高的:結構體運算符“.”和“->”、用與函數調用的“()”以及用於下標的“[]”,因此它們同操作數之間的結合也最緊密。

例如對:

struct {
int len;
char *str;
}*p;

表達式
++p->len :增加len的值,其中的隱含括號關係是++(p->len)
(++p)->len: 先執行p的加1操作,再取len的值
(p++)->len: 先取len的值,再執行p的加1操作
*p->str: 取指針str所指向的對象的值
*p->str++:先取指針str所指向的對象的值,然後將str加1
(*p->str)++:先取指針str所指向的對象的值,然後將對象值加1
*p++ ->str:先取指針str所指向的對象的值,然後將P值加1


      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章