是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構體。
個人覺得結構體就是乙個資料型別的擴充、更具有綜合性、普遍性、適用性,因為目前階段的發展,簡簡單單的數字、字元已經很難滿足目前的資料需求,為了滿足這個需求,結構體出現了。
//例1:
struct mail//宣告乙個名字為mail的結構體,
//結構體中的資料型別分別為字元陣列、字元陣列、整形、字元陣列
;struct li_mail//宣告乙個明為li_mail的結構體,
//結構體中的資料型別分別為 另外乙個名為mail結構體、整形
;//以上兩個例子說明了結構體的組成可以是基本的資料型別,也可以是一些結構體。
//例2:
struct
a,b,c,*p;
//這個結構體沒有名字,只能直接在後面跟上定義的結構體變數,
//當然也只能定義一次,後面想再用肯定不行啦,因為你不知道名字的啦
//推薦不要這樣用啦,因為可能到時候你定義的這幾個a,b,c,以及結構體指標p是全域性變數
//使用時可能出問題啦。
//例3 (個人比較推薦的初學者寫法)
struct mail
;int main ()
;//定義了乙個結構體陣列,並全部初始化為『0』
}//每次都要寫struct可能會覺得很麻煩,其實可以用下型別重名,typedef
typedef
struct mail
mail; //將struct mail 型別重新命名為mail 後面呼叫時 就不用寫struct啦。
首先我們都知道int 、float、char、double等基本資料型別都有他的大小,說到底結構體就是乙個自定義的型別,它和上面那些基本的資料型別類似,有自己的大小,不過就是是結構體的大小相對來說算起來有點麻煩而已,接下來我會帶大家來分析下結構體大小的規則。
3.1記憶體對齊
在正式跟大家分析結構體大小之前先和大家介紹個記憶體對齊
3.1.1什麼是記憶體對齊
資料在儲存時並不是一直是乙個位元組乙個位元組挨著儲存的,而是遵循一定的規則來保證訪問效率,如果是乙個乙個儲存時、讀取時,對cup的效率有一定的影響。詳細的建議大家看下又換作業系統的書籍,記憶體對齊涉及到底層的資料抓取方面的知識。
3.2結構體儲存規則
1.結構體第乙個型別從第0記憶體開始存,
2.下乙個型別大小必須對齊到乙個對齊數的整數倍處,對齊數是在這個型別的大小與開發環境預設對齊數中的小的那個。windos 下預設為4, linux預設為8
3.最後乙個型別計算完後 整個結構體的大小為整個結構體中各個型別的最大對齊數的整數倍。
4.如果結構體中巢狀結構體,則巢狀的結構體對齊到該結構體內最大對齊數的整數倍處,最後結構體整體大小仍舊是所有型別中對齊數最大的那個數的整數倍。
//例
struct mail
;//計算該結構體大小
//第乙個型別char name[20]; 從0開始存,需要19個位元組,接下來是char ***[5]
//因為對齊數為1,小於預設對齊數,則從下乙個直接開始存,存5位元組,現在為24位元組
//接下來是int age;對齊數為4則應該從下個為4的整數倍的地方開始存,
//則從28開始存 存到31,接下來是char num [20];對齊數為1,則緊跟著後面連續存20個
//現在為51位元組,但是又要是最大對齊數的整數倍,則就52位元組啦。
C語言結構體
1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...
C語言 結構體
宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...
c語言 結構體
1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...