结构体
结构体是一种由多个数据类型及数据复合而成的自定义数据类型。
他可以用来描述一个属性复杂的对象
例如:描述人类,需要用到int height,int weight,int age,char sex,char name[20]来描述一个人,那么我就应该把以上5个数据,分别为3个int 21个char封装成一个结构体类型,然后用该结构体去声明一个变量,该变量就能描述一个人类
结构体的自定义方式:
struct+结构体名{
具体的成员属性;
}
由于自定义的结构体是一个数据类型,他必须全局使用,所以通常情况下,会把自定义部分放在主函数外部
一个结构体中,可以包含任意类型的数据,但是不能包含自身结构体类型
结构体的内存管理
结构体在开辟内存的时候,会找到结构体内最大的数据,并开辟一段内存。然后将数据从上到下进行存储,空间不足,则继续开辟另一段
结构体在存放数据的时候,严格遵循字节对齐原则:88,44,22,11对齐
#include<stdio.h>
struct Data1{//这里最大的类型为double,8个字节
int a;//8
double b;//8
char c;//8
int d;
int e;//8
short f;
short g;
int h;//8
char i;
int j;//8
};
struct Data2{//这里最大的类型为double,8个字节
int a[25];//12*8+8
double b;//8
int c[25];//12*8+8
};
//这样定义结构体,到定义结构体变量有两个方式
//struct Data4 变量名
//data4 变量名
typedef struct Data3{//这里最大的类型为struct Data2结构体类型里的double,8个字节
struct Data2 p;//216
int a;//8,
}data3;
int main(){
printf("%d\n",sizeof(struct Data1));//48个字节
printf("%d\n",sizeof(struct Data2));//216个字节
printf("%d\n",sizeof(data3));//224个字节
return 0;
}
结构体的声明及定义
结构体类型名+变量名 = {一一对应的元素的具体值}
结构体的访问方式:既然已经使用了结构体来描述一个对象,那么就应该能够通过结构体获得该对象拥有的数据中的具体一项数据
结构体变量.具体成员数据 就能够访问到该结构体变量中的该成员数据具体的值
结构体属于普通变量,所以他能够整体之间相互赋值
#include<stdio.h>
//定义结构体类型,全局使用
typedef struct Data{
int height;
int weight;
int age;
char sex;
}Data;
typedef struct Person{
struct Data data;
char name[20];
}Person;
int main(){
//结构体变量的声明及定义
Data data = {180,150,20,'M'};
Person p1 = {data,"张三"};//把已经初始化的data结构体整体赋值给p1的成员data
Person p2 = {0};
//结构体的使用:结构体变量.具体成员数据
printf("姓名:%s\n",p1.name);
printf("年龄:%d\n",p1.data.age);
//结构体整体赋值
p2 = p1;
printf("姓名:%s\n",p2.name);
printf("年龄:%d\n",p2.data.age);
//结构体指针的使用
Person* p = &p1;
printf("姓名:%s\n",(*p).name);
printf("年龄:%d\n",p->data.age);
return 0;
}