C語言之結構體

2021-08-20 08:41:23 字數 1913 閱讀 9021

在c語言中,有一種型別聽著很任性,叫做自定義型別。顧名思義,這種型別是程式設計師自己定義的一種型別,它和陣列很相似,但也有一些區別。自定義型別包含以下幾種:①結構體  ②列舉  ③聯合

結構體就是將具有不同或相同的型別放在一起的聚合型別。

可能聽著有些像順口溜,上一段**,捋一捋。

struct peo

a;

在**中我們定義了乙個結構體,分開一一解讀,peo是結構體的標籤(可以省略,但不建議省略)花括號內的是結構體的成員,可以有各種型別,a是結構體的名字。

結構體訪問有兩種方法: ①點操作訪問  如:a.age;  ②-> 訪問   用於結構體指標的訪問,比如:struct peo *p=&a;p->a;

這裡定義了乙個結構體指標。

除此以外,我們還可以用 typedef struct來定義乙個結構體,例如:

typedef struct node

node;

在了解結構體如何定義的情況下,還應該知道結構體如何賦值:

node=;   由於我們用typedef 定義的結構體,因此這裡node就是可以直接表示結構體,不用再次宣告。

結構體如同陣列一樣,不能整體賦值,但可以整體初始化。

結構體有乙個比較特殊亦或是比較奇怪的地方,就是結構體的記憶體對齊:

struct s1

;printf("%d\n",sizeof(struct s1)); //12

struct s2

;printf("%d\n",sizeof(struct s2));//8

以上兩段程式,內容一樣,只是調整了順序,最後列印出來的結果卻不相同,若有異議,讀者可自行實驗。

這裡是因為結構體有記憶體對齊的特質,所以輸出結構不同。

結構體的記憶體對齊規則如下:

1、第乙個成員在與結構體變數偏移量為0的地質處。

2、其他成員變數要對齊到(對齊數)的整數倍位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。

在vs中預設值為8,linux預設值為4

3、結構體總大小為最大對齊數的整數倍。

4、若巢狀了結構體情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍。

掌握了這個規則,關於結構體的對齊數大體就不在話下了。   私下勤加練習,掌握的會蠻快的。

博主認為,結構體的記憶體對齊就是用空間來換取時間,有利有弊。

在結構體傳參過程中,應當盡量傳遞結構體的位址,而不是將結構體整體作為引數傳遞過去。

因為在函式形參例項化的時候,會形成棧幀,當結構體過於龐大時,特別費時間,導致效能下降。

(關於函式傳參詳細過程,讀者可自行參考  此篇部落格

列舉: 列舉也只自定義型別中的一種,列舉顧名思義就是一一枚舉。

enum day

;

列舉型別定義如此,{}裡面的內容是列舉型別的可能取值,也叫列舉常量。

我們可以用#define定義常量,但相比較,列舉有如下有點:

1.增加**的可讀性和維護性。

2.列舉有型別檢查,更加嚴謹。

3.防止了命名的汙染。

4.便於除錯。

5.使用方便,一次可以定義多個常量。

聯合(共用體):

聯合的特徵是成員公用同一塊空間,即所有成員的位址都是一樣的,是第乙個位元組的位址。

//聯合型別的宣告

union un

;

關於聯合大小的計算:

①聯合的大小至少是最大成員的大小。

②當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。

(關於對齊數的概念,在結構體中我們已經介紹過,這裡就不必贅言過多。)

C語言之結構體

一 什麼是結構體 結構體是不同型別的資料組合成乙個有機整體。例如 學生的學號 姓名 性別 成績 位址 這些都是乙個學生的屬性,把這些屬性組織成乙個組合,組合中包含不同的資料型別,c和c 允許指定這樣的資料型別,稱為結構體。struct student 申明乙個結構體型別 struct是結構體申明的關...

C語言之結構體

在c語言中,可以使用結構體 struct 來存放一組不同型別的資料。結構體的定義形式為 struct 結構體名 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 請看下面的乙個例子 struct stu stu 為結構...

c語言之結構體

結構體 為什麼需要結構體 為了表示一些複雜的事物,而普通的基本型別無 法滿足實際需求。什麼叫結構體 把一些基本型別資料組合在一起形成的乙個新的復合資料型別,這個叫結構體 如何定義結構體 第一種方式 這只是定義了乙個新的資料型別,並沒有定義變數 struct student 第二種方式 struct ...