如大家所知,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