C語言結構體

2021-08-01 22:42:35 字數 2795 閱讀 2550

在c語言中,可以使用

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

struct 結構體名;

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

成員(member)。請看下面的乙個例子:

複製

純文字複製

struct

stu;

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;

struct stu stu1, stu2;
將變數放在結構體定義的最後即可。

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

複製

純文字複製

struct

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;

}

#include int main() 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);

return 0;

}

執行結果:

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

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

複製

純文字複製

struct

stu1, stu2 =

;

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

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

C語言結構體

1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...

C語言 結構體

宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...

c語言 結構體

1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...