C語言基礎學習筆記——結構體

1.結構體概念
C語言提供了兩種數據類型的聚合方式,分別是數組和結構體。數組之前已經學習過,存儲的數據必須是類型相同,但這並不能滿足我們使用需求,尤其是在面向對象編程的過程中,比如我們需要描述一個學生對象,這個學生包括姓名、年齡、住址、學號、成績等信息,只用一種數據類型顯然不能描述完全。因此,引入結構體這個概念,結構體可以存儲不同類型的數據,這些數據稱爲它的成員

2.結構體的聲明

結構體聲明一般放在主函數外面:

struct Student
{
	char name[20];
	int age;
	char sex;
}student;		//分號不能忘記,在這裏x就是全局結構體變量

int main()
{
	//其他語句;
	return 0;
}

這個結構體創建了一個結構體變量student,結構體包含三個成員:名字char型數組、年齡整型age和性別字符char。在聲明時可以有結構體變量student,此時結構體x是全局變量,也可以先聲明結構體,在函數中再創建結構體變量,那麼此時x就是局部變量。比如:

struct Student
{
	char name[20];
	int age;
	char sex;
};

void fun()
{
	struct Student XiaoMing;		//這裏struct Student相當於下面的int,就是一種類型標識,這裏XiaoMing就是局部結構體變量
	int a;		
}

int main()
{
	//其他語句;
	return 0;
}

其中標籤Student可以省略,這個結構體就成了匿名結構體,一般不建議這麼做。

struct 
{
	int a;
	char ch;
}x;

struct
{
	int a;
	char ch;
}a[20],*p;		//a[20]包含了20個結構體,p是一個指針,它指向結果

上面兩個結構都忽略了結構體標籤(如Student),那麼p=&x這個語句成立嗎??
警告:這兩個聲明被編譯器當做兩種截然不同 的類型,即使成員相同。所以,變量a,p,x,類型不同,不可p=&x。

3.用typedef定義結構體

typedef struct 
{
	char name[20];
	int age;
	char sex;
}Student;

int main()
{
	Student XiaoMing;
	Student LiHUa;
	return 0;
}

用typedef後,Student相當於類型名,可以用來創建變量。

4.結構體成員的訪問
數組元素我們可以使用下標的方式訪問,這是因爲數組元素長度類型長度都相同,但結構體因爲其成員類型、長度都不相同,所以不能通過下標方式來訪問。但是結構體成員都有名字,可以通過名字訪問他們,在這裏也有兩種方法。
通過結構體變量本身,運用 . 操作符訪問

struct Student
{
	char name[20];
	int age;
}student1;

int main()
{
	strcpy(student1.name,XiaoMing);
	student1.age=18;
	printf("%s %d",student1.name,student1.age);
	return 0;
}

通過結構體指針,運用->進行訪問

struct Student
{
	char name[20];
	int age;
}student1;

int main()
{
	struct Student *p;
	p=&student1;
	strcpy(p->name,XiaoMing);
	p->age=18;
	printf("%s %d",p->name,	p->age);
	return 0;
}

兩種方式的結構都爲:XiaoMing 18

5.結構體自引用
結構體中可以有任意類型的數據類型,那麼能不能包含其它結構體或結構體本身呢?

struct stu
{
	int a;
	char ch[20];
	struct stu y;
}x;

這種方式的引用是不正確的,因爲不知道結構體y的空間大小,系統無法爲其分配空間。正確的方式如下:

struct stu
{
	int a;
	char ch[20];
	struct stu *y;
}x;

這裏的struct stu *y是指針類型,佔用內存大小爲4個字節。

6.結構體的定義和初始化

struct Student
{
	int age;
	char name[20];
	double mathScore;
}xiaoMing,xiaoHong;		//可直接在這裏定義
struct Student s1;
struct Student s2;		//也可以在這裏定義
//完全初始化
struct Student xiaoMing={18,"xiaoMing",85};
//部分初始化
struct Student xiaoHong={.name="xiaoHong",.mathScore=90};
//結構體變量之間的賦值
xiaoHong=xiaoMing;

xiaoHong.name="小花"		//錯誤的,正確應該如下
strcpy(xiaoHong.name,"小花");
//注:數組不可以整體賦值,可整體初始化。同理,結構體不可整體賦值,可以整體初始化。結構體地址數值等於第一個成員地址數值。

7.結構體內存對齊
請移步:
https://blog.csdn.net/dai_wen/article/details/78304568

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章