如何系統學習C 語言(中)之 結構體篇

Charmchin發表於2021-11-11

1,結構體

在前面我們知道變數和陣列都可以用來儲存資料,變數用來儲存單個資料,陣列可以用來儲存一組同型別的資料,但你有沒有發現——它們都只適合單一屬性的資料。那現實生活中,很多物件都是具有多屬性的。例如一個人,都具有姓名、年齡、身高、體重等各種屬性。那該如何是好呢?

別急,C語言中的結構體屬於複合型別,它是其他資料型別構造出的一個新資料型別。結構體可以擁有眾多的成員,而且各成員的資料型別可以各不相同。因此,它是非常適合擁有多屬性的物件進行儲存。

Ⅰ,結構體型別的定義

定義格式為:

struct 結構體型別名{
	資料型別 成員名;
	資料型別 成員名;
	...
};	//特別注意此處的分號不要遺忘

下面試著定義關於人的結構體型別,例如:

struct Person{
	char name[20];	//姓名
	int age;		//年齡
	float height;	//身高
	float weight;	//體重
};

特別注意,上面定義的是一個結構體型別,它是不能用於儲存資料的。就好像int 是一個資料型別,它是不能儲存資料一樣。如果要儲存資料需要再定義出該型別的變數,如:

int a;

下面就說一下如何定義結構體型別的變數。

Ⅱ,結構體變數的定義

1,先定義結構體型別,再定義結構體變數,例如:

struct Person p1;	//注意:這條語句是定義了struct Person 型別的變數p1。也就是說,結構體型別不光是型別名字本身,前面還需加上“struct”關鍵字。

2,在定義結構體型別的同時定義結構體變數,例如:

struct Person{
	char name[20];	//姓名
	int age;		//年齡
	float height;	//身高
	float weight;	//體重
} p2;

3,定義無名結構體型別變數,例如:

struct {
	char name[20];	//姓名
	int age;		//年齡
	float height;	//身高
	float weight;	//體重
} p3;

Ⅲ,結構體變數的初始化與賦值

再定義結構體變數時,可以對其進行初始化。結構體變數的初始化方式與陣列類似,使用大括號將初始值列表括起來。不過,列表中初始值的型別和順序要與結構體成員的型別和順序匹配。例如:

struct Person p1 = {"Tom",20,1.70f,60.1f};

Ⅳ,結構體成員的訪問

C語言中,使用成員訪問運算子(“.”)來訪問結構體變數的各成員,我們常說的點運算說的就是它了:

結構體變數名.成員名

Ⅴ,結構體的大小

基本資料型別都有相對固定的大小,而結構體是符合資料型別,它的成員的型別、數量都是不固定的,但我們可以通過sizeof運算子來獲取結構體的大小,例如:

printf("Size of the struct Person: %u bytes.\n",sizeof(struct Person));

Ⅵ,結構體的巢狀

C語言中可以將一個結構體作為另外一個結構體的成員,即允許結構體的巢狀使用,如下例子:

//定義一個日期的結構體型別Date
struct Date{
	short year;
    short month;
    short day;
};

//然後再Person的結構體中再新增一個Date結構體型別的成員birthday,用來表示人的生日
struct {
	char name[20];	
	int age;		
	float height;	
	float weight;
    struct Date birthday;	//生日
} ;

//初始化如下:
struct Person ls={"lisi",20,1.52,45.5,{1999,8,28}};

//訪問birthday中的成員如下方式
ls.birthday.year;
ls.birthday.month;

2,結構體的運用

上面介紹了結構體型別與結構體變數之後,下面我們就要學著運用它了。不要讓結構體孤零零的存在,要讓它發揮應用的作用,應該讓它與指標、陣列、函式等結合起來,只有這樣我們的程式碼才會靈活、高效、優美。

至於江湖中結構體與指標、結構體與陣列、結構體與函式以及結構體與字串的打打殺殺,亦或是人情世故,就留給我們自己到江湖上去體會吧!

相關文章