C 結構體 struct 詳解

2021-07-25 04:04:55 字數 2305 閱讀 9669

陣列(array),它是一組具有相同型別的資料的集合。但在實際的程式設計過程中,我們往往還需要一組型別不同的資料,例如對於學生資訊登記表,姓名為字串,學號為整數,年齡為整數,所在的學習小組為字元,成績為小數,因為資料型別不同,顯然不能用乙個陣列來存放。

在c語言中,可以使用

結構體(struct)

來存放一組不同型別的資料。結構體的定義形式為:

struct 結構體名;

結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的

成員(member)

。請看下面的乙個例子:

struct

stu;

stu 為結構體名,它包含了 5 個成員,分別是 name、num、age、group、score。結構體成員的定義方式與變數和陣列的定義方式相同,只是不能初始化。

注意大括號後面的分號;不能少,這是一條完整的語句。
結構體也是一種資料型別,它由程式設計師自己定義,可以包含多個其他型別的資料。

像 int、float、char 等是由c語言本身提供的資料型別,不能再進行分拆,我們稱之為

基本資料型別

;而結構體可以包含多個基本型別的資料,也可以包含其他的結構體,我們將它稱為

複雜資料型別

或構造資料型別

。既然結構體是一種資料型別,那麼就可以用它來定義變數。例如:

struct stu stu1, stu2;
定義了兩個變數 stu1 和 stu2,它們都是 stu 型別,都由 5 個成員組成。注意關鍵字struct不能少。

stu 就像乙個「模板」,定義出來的變數都具有相同的性質。也可以將結構體比作「圖紙」,將結構體變數比作「零件」,根據同一張圖紙生產出來的零件的特性都是一樣的。

你也可以在定義結構體的同時定義結構體變數:

struct

stu stu1, stu2;

將變數放在結構體定義的最後即可。

如果只需要 stu1、stu2 兩個變數,後面不需要再使用結構體名定義其他變數,那麼在定義時也可以不給出結構體名,如下所示:

struct

stu1, stu2;

這樣做書寫簡單,但是因為沒有結構體名,後面就沒法用該結構體定義新的變數。

理論上講結構體的各個成員在記憶體中是連續儲存的,和陣列非常類似,例如上面的結構體變數 stu1、stu2 的記憶體分布如下圖所示,共占用 4+4+4+1+4 = 17 個位元組。

但是在編譯器的具體實現中,各個成員之間可能會存在縫隙,對於 stu1、stu2,成員變數 group 和 score 之間就存在 3 個位元組的空白填充(見下圖)。這樣算來,stu1、stu2 其實占用了 17 + 3 = 20 個位元組。

關於成員變數之間存在「裂縫」的原因,我們將在《

c語言和記憶體

》專題中的《

c語言記憶體對齊,提高定址效率

》一節中詳細講解。結構體和陣列類似,也是一組資料的集合,整體使用沒有太大的意義。陣列使用下標[ ]獲取單個元素,結構體使用點號.獲取單個成員。獲取結構體成員的一般格式為:

結構體變數名.成員名;

通過這種方式可以獲取成員的值,也可以給成員賦值:

#include

intmain

() stu1;

//給結構體成員賦值

stu1.name =

"tom"

;stu1.num =12;

stu1.age =18;

stu1.group =

'a';

stu1.score =

136.5

;//讀取結構體成員的值

printf

("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n"

, stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);

return0;

}

執行結果:

tom的學號是12,年齡是18,在a組,今年的成績是136.5!

除了可以對成員進行逐一賦值,也可以在定義時整體賦值,例如:

struct

stu1, stu2 =

;

不過整體賦值僅限於定義結構體變數的時候,在使用過程中只能對成員逐一賦值,這和陣列的賦值非常類似。

需要注意的是,結構體是一種自定義的資料型別,是建立變數的模板,不占用記憶體空間;結構體變數才包含了實實在在的資料,需要記憶體空間來儲存

C語言之結構體 struct 詳解

目錄 原有的資料型別不能滿足需求,因此才設計了構造型別結構體 struct name 1.無名構造型別 2.有名構造型別 程式設計客棧 struct swww.cppcns.comtudent stu struct student stu2 3.別名構造體型別 typedef struct stud...

C語言結構體struct

定義 定義結構體,要定義兩次,1定義型別,2定義變數 1定義時 不分配記憶體,和 define一樣 定義結構體的樣式,叫什麼名字,成員,句式 2再定義 分配記憶體 用著個樣式定義變數 與typedef有點像 3如果定義的是 p指標,只表示出此結構體 變數的起始位址 struct a struct a...

C語言結構體(Struct)

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