C語言 結構體使用詳解

2021-09-11 01:49:05 字數 3162 閱讀 5297

我們都知道c語言中變數的型別決定了變數儲存占用的空間。當我們要使用乙個變數儲存年齡時可以將其宣告為int型別,當我們要使用乙個變數儲存某一科目的考試成績時可以將其宣告為float。

那麼,當我們要做乙個學生資訊管理系統時,需要儲存學生的姓名、學號、年齡等資訊,該怎麼做呢?

如當要儲存三個學生的資訊時,

方法一是:

char

*name1,

*name2,

*name3;

// 三個學生的姓名

int num1,num2,num3;

// 三個學生的學號

int age1,age2,age3;

// 三個學生的年齡

方法二是:

// 建立結構體模板

struct student

;// 使用該結構體模板建立三個變數stu1, stu2, stu3

struct student stu1, stu2, stu3;

顯然,方法二跟更清晰,因為它把name、num、age都整合在乙個模板,要用的時候只要套用模板進行建立即可。這就是結構體

結構體(struct)是由一系列具有相同型別或不同型別的資料項構成的資料集合,這些資料項稱為結構體的成員。如上面的student結構體包含三個成員,分別是name、num、age。

結構體是c語言中的一種構造型別。c語言的資料型別如下圖:

結構體變數的定義方法

// 建立結構體模板struct student

struct student

;// 使用該結構體模板建立三個變數stu1, stu2, stu3

struct student stu1, stu2, stu3;

此處,student是結構體名,該名字是由任意定義的,但是盡量起個有意義的名稱。其相當於乙個模板,可以使用這個模板去定義變數stu1,stu2,stu3。定義的時候不要忘了struct。

// 定義三個結構體變數stu1, stu2, stu3

struct

stu1, stu2, stu3;

相對於方法一,此處省略了結構體名。雖然更簡潔了,但是因為沒有了名字,後面就不能用該結構定義新的變數。

// 給結構體模板struct student重新命名為student

typedef

struct student

student;

// 使用student建立三個結構體變數stu1, stu2, stu3

student stu1, stu2, stu3;

此處使用typedef為結構體模板struct student定義乙個別名student,關於typedef的介紹移步至#define與typedef的區別?進行檢視。使用typedef給結構體建立乙個別名,這在實際程式設計用使用非常廣泛,如stm32微控制器韌體庫中,使用得很多,如下圖:

初始化變數和陣列如下:

int count =0;

int arr[7]

=;

結構體變數是否也可以這樣初始化?是的,可以。與初始化陣列的語法類似:

struct student stu1 =

;

簡而言之,我們使用在一對花括號中括起來的初始化列表進行初始化,各初始化項用逗號分隔。

為了讓初始化項與結構中各成員的關聯更加明顯,我們讓每個成員的初始化項獨佔一行。這樣做只是為了提高**的可讀性,對編譯器而言,只需要用逗號分隔各成員的初始化項即可。

c99和c11為結構提供了指定初始化器(designated initializer)。其初始化器使用點運算子和成員名。例如,只初始化student結構中的name成員,可以這樣做:

struct student stu1 =

;

也可以按照任意順序使用指定初始化器:

struct student stu1 =

;

另外,對特定成員的最後一次賦值才是它實際獲得的值。例如,考慮如下**:

struct student stu1 =

;

此時,賦給num的值應該是1314,因為它在結構宣告中緊跟在name成員之後。新值1314取代了之前的520。

指定初始化器在實際程式設計中也很常用到。如在linux2.6.32.2原始碼的usb驅動中(路徑為:linux-2.6.32.2\drivers\usb\storage\usb.c),有如下**:

結構體成員的訪問需要借助結構體成員運算子——點(.)。如:

student stu1;

// 定義乙個結構體變數stu1

stu1.name =

"zhengnianjun"

;// 給stu1的成員name賦值

stu1.num =

520;

// 給stu1的成員num賦值

stu1.age =23;

// 給stu1的成員age賦值

#include

typedef

struct student

student;

intmain

(void

)

程式執行結果為:

結構體是一塊很重要的內容,用得很多。關於結構體的記憶體對齊可檢視往期筆記:【c語言筆記】結構體內存對齊問題

以上就是關於結構體的一些筆記,如有錯誤歡迎指出。謝謝!

C語言詳解 結構體

1.什麼是結構體?結構體是一種工具,用這個工具可以定義自己的資料型別。2.結構體與陣列的比較 1 都由多個元素組成 2 各個元素在記憶體中的儲存空間是連續的 3 陣列中各個元素的資料型別相同,而結構體中的各個元素的資料型別可以不相同 3.結構體的定義和使用 1 一般形式 struct 結構體名 st...

結構體指標,C語言結構體指標詳解

結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。前面我們通過 結構體變數名.成員名 的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。前面講過,student1 表示結構體變數 student1 的首位址,即 student1 第乙個項的位址。如果定義乙個指標變數 p 指...

c語言的結構體詳解

什麼是結構體?簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構...