程式設計師成長之旅 C語言自定義型別

2021-09-24 23:37:48 字數 2826 閱讀 3575

列舉聯合

特點結構體型別的建立

首先要知道結構體是什麼?

這樣才可以建立乙個結構體。舉個例子

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 結構體巢狀初始化 先來看下...