结构体类型
例:
struct Student
{
int sno;
char name[30];
char sex;
float score;
};
语法
struct 结构体类型名
{
成员列表
}
1.struct 关键字
表示 是在构造一个结构体的类型
2.结构体名
用来 描述 结构体这个类型 一个名称
3 成员列表
表示 要描述的复杂数据 中 用到的 具体的成员变量
多个成员变量之间,要用分号隔开
4最后 有一个 分号表示结束
注意
1.结构体类型的使用的过程
a.先定义出类型
b.定义变量
2定义变量
struct 结构体名 变量名
--------
结构体类型
结构体初始化:
struct student s = {}
初始化
看每个成员变量,具体是什么数据类型
根据每个成员变量 自身的数据类型,进行初始化
初始化顺序,按定义的顺序,依次初始化
结构体变量的引用
形式1 先定义类型,然后定义变量
struct demo
{
};
struct demo d;
形式2:定义类型的同时,定义变量
struct demo
{
}d;
形式3:定义类型的同时,定义变量,可以省略结构体名
struct
{
}d; //如果结构体只用一次可以这么用
结构体类型的大小
判断依据:内存对齐
结构体对齐规则
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
char -- 1字节
short -- 2字节
int -- 4字节
3.如果 成员变量中有比4字节大。
此时 整个结构体 按照4字节对齐。 //32位的平台
4.如果 成员变量中没有有比4字节大。
此时 整个结构体 按照最大的那个成员对齐。
//32位的平台
//如果有超过4字节 ,按照4字节对齐
//如果没有超过4字节的,则按成员变量中最大对齐
----------------------------------------------
//64位的平台
//如果超过4字节的,按超过的最大的成员变量对齐
//如果没有超过4字节的,则按成员变量中最大对齐
qsort(快速排序)
void qsort(
void *base, //要排序的数组的首地址
size_t nmemb, //数组元素的个数
size_t size, //单个元素的大小
int (*compar)(const void *, const void *) //比较函数 --- 提供比较依据
);
//功能:对数组进行排序
//其中比较函数部分需要我们自己写出来,这是一个回调函数
void qsort(
void *base, //要排的数组的首地址
size_t nmemb, //数组元素的个数
size_t xiae, //单个元素的大小
int (*compar)(const void *a,const void *b) //比较函数——提供比较的依据,需要自己写
)
功能:排序数组
总结:
1.理解结构体概念及用途
2.使用方法
a.自己构造出这个结构体类型
b.类型使用:定义变量;定义数组;定义指针;做函数形参(结构体类型指针);做函数返回值
3.考点:结构体类型的大小计算
共用体:union
语法:
union 共用体名
{
成员变量;
};
eg:
union demo
{
char a;
short b;
int c;
};
共用体:共用了一块内存空间,公用了最大成员的空间
注意:
1.共用体初始化时,只能给一个值,默认时给到第一个成员符。
2.共用体变量中的值,取决于最后一次给到的值,还有看能影响几个字节
union demo //定义一个共用体类型
{
int a;
char b;
}
int main()
{
union demo d; //定义共用体变量
d.a = 0x12345678; //给a成员赋值
d.b = 0xab; //给b成员赋值
printf("d.a = %#x\n",d.a); //因为两个成员共用一块4个字节的空间
//所有这块空间上存储的数据受最后一次赋值的影响
return 0; //但是b成员只能影响一个字节,所有a的值为0x123456ab;
}
对比结构体
1.结构体中各个成员拥有自己独立空间
2.共用体中成员共用一块空间