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