我們都知道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語言的結構體詳解
什麼是結構體?簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構...