結構體
先簡單的介紹一下結構體
結構體是一種型別,是一些值的集合,這些值稱為成員變數。結構體的每個成員可以是不同型別的變數。
1. 結構體型別的建立
struct
stua,*p;
這裡stu是結構體名稱,
a是結構體變數,
*p是指向結構體的指標。在建立結構體時,結構體名稱不能省略,否則無法引用結構體。
在定義結構體時不能出現類似遞迴的自呼叫,無法為結構體分配記憶體。若想自呼叫,可以通過指標實現。
例:struct
node
;兩個結構體需互相呼叫時,後面定義的結構體的應在定義前面的結構體之前提前宣告。
struct
b;structa;
struct
b ;2.結構體初始化
結構體在初始化時可以整體賦值,但在賦值時不可以整體賦值。
簡單的初始化:
struct
stua;
struct
stu a = ;
結構體巢狀初始化:
struct
point
;struct
data
;struct
data d = ,null };
結構體初始化和陣列一樣都用{},結構體巢狀再用
{}表示巢狀的結構體。
3結構體內存對齊
為什麼存在記憶體對齊?
1. 平台原因(移植原因): 不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能 在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2. 效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的 記憶體訪問僅需要一次訪問。1)
.第乙個成員
有對齊數,但不用對齊。2)
. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。
vs中預設的值為8
linux中的預設值為43)
.結構體總大小為最大對齊數
(每個成員變數除了第乙個成員都有乙個對齊
數)的整數倍。4)
. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍
處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整
數倍。用例子解釋一下
structs1;
c1是第乙個成員不用參與對齊,但
它有對齊數是1;
i是第二個成員,對齊數是
4,此時
c1應與之對齊,所以
c1後空了3個
c2對齊數是
1,結構體總大小為最大對齊數的整數倍,此時為9,
c2後應空3個
結構體總大小為12
c2與c1
對齊,對齊數是
1,滿足,緊挨
c1存放。
i對齊數是4,空
2個再存放
d是第乙個成員,有對齊數,不用對齊,
c對齊數是
1,緊挨
d存放,
i對齊數是4,
空3個再存放。最大對齊數是
//結構體巢狀問題
structs4;
巢狀的結構體對齊到自己的最大對齊數的整數倍處
4.位段,位段計算機大小
位段的宣告和結構是類似的,有兩個不同:
1.位段的成員必須是 int、unsigned int 或signed int 。
2. 2.位段的成員名後邊有乙個冒號和乙個數字。
structs;
int main()
;s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
位段元素之間相互不受影響,若存放元素時空間不夠,自動捨棄,不會占用其他成員的空間,
struct預設
4自己,
int型
在分配空間時,在預設4位元組之內連續存放,若最後乙個放不下,直接開闢新的
int型空間。
5.列舉+聯合
(1)列舉
列舉的優點
1. 增加**的可讀性和可維護性
2. 很#define定義的識別符號比較列舉有型別檢查,更加嚴謹
3. 防止了命名汙染(封裝)
4. 便於除錯
5. 使用方便,一次可以定義多個常量
<1>列舉的定義
enum
day;
enum day是列舉型別,
mon,
tues
,wed...
是列舉成員
<2>列舉的使用
enum
day;
int main()
在使用列舉時,只能用列舉常量給列舉變數賦值,才不會有型別的差異
列舉成員預設從0開始取值,依次加
1.(2)聯合
特點:聯合體的成員共用一塊記憶體空間,使用與結構體類似
聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合變數的大小,至少是最大成
員的大小(因為聯合至少得有能力儲存最大的那個成員)
unionun;
int main()
;最大對齊數是4 ,最大成員大小是
5,對齊到最大對齊數的整數倍,所以聯合大小為8
最大對齊數是4 ,最大成員大小是
14,對齊到最大對齊數的整數倍,所以聯合大小為16
結構體複習
1.編寫乙個函式print,輸出若干位學生的資料記錄,有5位學生,每一位學生的資料記錄包括學號 num 姓名 name 三門課的成績 g 3 要求用主函式輸入這些記錄,用print函式輸出這些記錄。請定義結構體程式設計實現。an highlighted block var foo bar inclu...
複習2 結構體
第五章 結構體 主要內容 1.結構體型別的定義 2.結構體變數的引用 3.結構體變數的初始化 4.結構體陣列 5.指向結構體變數的指標 1.struct 結構體名 struct是關鍵字,不能省略。結構體型別與結構體變數概念不同 型別 不分配記憶體,不能賦值 訪問 運算 變數 分配記憶體,可以賦值 訪...
複習結構體和typedef struct
複習結構體和typedef為接下來的資料結構學習做準備 c語言提供了一些由系統已定義好的資料型別,如 int,float,char等,使用者可以在程式中用他們定義變數,解決一般的問題,但是人們要處理的問題往往比較複雜,只有系統提供的型別還不能滿足應用的要求,c語言允許使用者根據需要自己建立一些資料型...