列舉聯合
特點結構體型別的建立
首先要知道結構體是什麼?這樣才可以建立乙個結構體。舉個例子
struct stu
;//分號一定要有
特殊的結構體的建立
struct
x;struct
a[10],
*p;
上面兩種結構體建立宣告時,省略了標籤tag,也就是struct後面的東西。
那麼可以直接用p=&x嗎?
警告:編譯器會把他們當成兩個不同的型別所以是非法的。
結構體的自引用
struct node
;typedef
struct
node;
//這樣寫是完全不行的
//正確的應該是
typedef
struct node
node;
結構體的初始化struct point
p =;
//宣告型別的同時定義結構體的變數以及初始化
struct point p1 =
;//定義結構體的變數以及初始化
struct node
n1=,
null};
struct node n2 =
,null};
//結構體巢狀初始化
結構體內存對齊
結構體內存對齊的大小求值主要是通過下面四個步驟計算:
舉個例子:struct s1
;//大小是多少?
//結構巢狀記憶體對齊
struct s2
;int
main()
根據上面的步驟來不難計算出來,24和40。
我們有沒有思考過為什麼存在記憶體對齊?
//1.平台原因:不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。設計結構體的時候我們要節省空間又要節省時間,那什麼樣才是最佳的結構體設計呢?//2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問只需要一次。>
//3.總的來說:結構體內存對齊就是用空間換時間。
struct s
;struct s1
;
s1明顯比s更節省空間。
如果對齊數不合適的時候,我們可以怎麼辦呢?
修改對齊數
#pragma pack(4)
struct s
;#pragma pack()
//取消預設對齊數
intmain()
結構體位段的實現
位段的宣告
位段的宣告和結構體是類似的,只有兩點不同。
舉個例子和結構體比較,位段可以很好的節省空間,但是存在跨平台問題。位段計算大小時不考慮對齊問題。
定義
enum day//星期
;enum ***//性別
;enum color//顏色
;
上面的enum ***, enum color ,enum day,都是列舉型別,裡面的是列舉常量。
列舉的預設初值是0,然後依次遞增加一,當然也是可以賦初值。
enum color//顏色
;
特點1.增加**的可讀性和可維護性使用2.便於除錯
3.一次可定義多個變數
4.防止了命名汙染(封裝)
5.和#define比較有型別檢查,更加嚴謹
定義聯合是一種特殊的自定義結構體,這個結構體包括了多個成員,而這些成員共用乙個空間,因此聯合也叫作共用體。
聯合的成員共用一塊記憶體空間,這樣乙個聯合的記憶體空間至少是最大成員的大小。
計算
程式設計師成長之旅 C語言分支迴圈語句(初階)
分支語句 選擇結構 迴圈語句 for迴圈 goto語句 分支語句 迴圈語句 什麼是語句?c語言中用乙個 隔開的就是乙個語句 printf hello sum a b 如果你不好好學習,你將找不到工作。這就是選擇!if語句 if 表示式 語句 if 表示式 語句1 else 語句2 多分支 if 表示...
程式設計師成長之旅 C語言旋轉字元函式實現
實現乙個函式,可以左旋字串中的k個字元。abcd左旋乙個字元得到bcda abcd左旋兩個字元得到cdab 採用迴圈移位,對需要旋轉的k個字元按順序進行旋轉,先將要旋轉的乙個字元儲存起來,將後面的往前挪動一位,再將儲存起來的這個字元賦給最後一位,這樣連續迴圈k次。include include in...
c語言 自定義型別
struct stu 分號不能丟 匿名結構體型別 struct x struct a 20 p p x 非法的操作,上面倆種完全是不同的宣告 struct node 結構體的自引用 struct node n1 null 直接初始化 struct node n2 null 結構體巢狀初始化 先來看下...