1. 什么是结构体?
结构体是一种工具,用这个工具可以定义自己的数据类型。
2. 结构体与数组的比较
(1) 都由多个元素组成
(2) 数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以不相同
3. 结构体的定义和使用
struct 结构体名
{
类型1 成员1;
类型2 成员2;
…
类型n 成员n;
};
例如:
struct Student
{
char name[20];
char num[20];
char sex;
int math;
};
(1).定义结构体类型时可以同时定义该类型的变量:
struct Student
{
char name[20];
char num[20];
char sex;
int math;
}student,*p,stu[10];//定义结构体类型的普通变量、指针变量和数组
(2).也可以先定义结构体类型,在定义该类型的变量
struct Student
{
char name[20];
char num[20];
char sex;
int math;
};
struct Student student,*p,stu[10];
(3).使用typedef定义别名,再用别名定义该类型的变量
typedef struct Student
{
char name[20];
char num[20];
char sex;
int math;
}stud;
stud student,*p,stu[10];
4.初始化结构体
struct Student
{
char name[20];
char num[20];
char sex;
int math;
}stu[2]={{"xiaoming",1,'m',100},{"xiaohong",2,'w',100}};
5.引用结构体变量中的成员
1) 结构体变量名. 成员名: stu1.name
2) (*结构体指针变量). 成员名: (*ps).name
3) 结构体指针变量->成员名: ps->name
4) 结构体变量数组名. 成员名: stu[0].name
6.结构体变量所占内存空间问题
#include<stdio.h>
struct Student
{
char name;
char num;
char sex;
int math;
};
int main()
{
struct Student a;
printf("%d",sizeof(a));
getchar();
return 0;
}
#include<stdio.h>
struct Student
{
char name;
char num;
int math;
char sex;
};
int main()
{
struct Student a;
printf("%d",sizeof(a));
getchar();
return 0;
}
上面两个代码,结构体中定义变量的顺序不同,导致输出结果不同,第一个代码输出结果,结构体a占8个字节,而第二个占12个字节。原因是该结构体中,数据类型占字节最大的是int型(4个字节),所以一次开辟4个字节;(1).char name占一个字节,开辟四个字节,剩3个字节,后面的char num和char sex可以在剩余的3个字节内进行补充,最后int math再开辟4个字节,所以一共占8个字节。(2).char name占1个字节,开辟4个字节后,剩3个字节;char num占一个字节,之前剩3个字节,num可以进行补充;int math占4个字节,开辟4个字节;char sex占一个字节,再开辟4个字节,所以是12个字节。
下面用图来说明
代码1:
代码2:
结论:结构体所占内存一定为最大成员所占字节数的倍数。
注意:在使用结构体时,各成员相同数据类型应该放在一起,这样可以减少空间。