结构体
int score[30];
char name[30][20];
float height[30];
...
结构体:
提供给用户(程序员)
自定义一种数据类型 --程序员根据问题的需要,自己来组织一种数据类型
可以描述现实生活中一些 用基本数据类型不好描述的 场景
结构体,可以把不同类型的数据集合在一起
语法:
struct 结构体名
{
//成员变量 --- 各个成员变量之间用; 隔开
}; //有 分号
eg.//定义了一个学生的结构体类型
struct student
{
int sno;
char name[20];
float score;
char sex;
}; //这表示构造一个 数据类型
int
float
short
//使用结构体的思路:
int --定义--->变量/指针/数组/函数形参/函数返回值类型
自己先构造出结构体类型 --->有了类型--->变量/指针/数组/函数形参/函数返回值类型
结构体变量的使用
. //结构体成员运算符
用法:
结构体变量名.结构体成员变量名
//表示访问到结构体的成员
注意:
1.结构体初始化
按照成员变量顺序依次初始化
成员变量 本身的方式初始化
2.赋值
相同类型的结构体变量 之间可以相互赋值
给结构体成员变量赋值 ,按照成员变量本身的方式赋值
输入也是 员变量本身的方式输入
结构体可以做函数的形参
//结构体类型的变量 (不推荐)
//结构体类型的指针 (推荐)
-> 指向结构体成员运算符
用法:
结构体指针->结构体成员变量名
. //结构体成员运算符
用法:
结构体变量名.结构体成员变量名
//表示访问到结构体的成员
练习:
封装要给输入函数,实现对结构体数组的输入
练习:
找出成绩最高的学生 打印他的信息
练习:
qsort
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
功能:
排序一个数组
参数:
@base 数组起始位置
@nmemb 数组中元素的个数
@size 单个元素的大小
@compar 表示排序的依据
反应数组中两个元素之间大小关系
//比较规则的回调函数
int compar(const void *a, const void *b)
{
....
说明这两个元素之间的大小关系
>
<
==
return >0 ==0 <0
}
a 和 b 表示 是某两个数组元素的地址
结构体对齐
问题:
你知道结构体对齐吗?
计算结构体大小吗?
为什么要对齐?
内存对齐
考点:
32位 --- 数据总线 和 地址总线
要求:
内存对齐
1. 对于基本类型的数据
尽可能把数据放自然边界对齐
结构体对齐:
1. 成员变量,都放在自然边界对齐
2. 整个结构体,按照成员变量中最大来对齐
补充:
共用体的大小 得是 被最大的成员变量大小整除
判断小端
上图结构体所占字节为12字节
1.共用体中最长str[6],为6字节,但要满足int 类型(4字节)的整除边界条件,则共用体占8字节;
2.结构体中int占4字节;
所以整体占12字节;
结构体定义形式
//形式1
struct demo
{
....
}; //1.定义结构体类型
struct demo d; //2.定义变量
//形式2
struct demo
{
....
}d={初始化}; //1.定义结构体类型 //2.定义变量
//形式3 ----如果你的结构体类型只用一次
struct
{
....
}d={初始化}; //1.定义结构体类型 //2.定义变量
struct ????
union
union demo
{
char a;
short b;
int c;
};
//共用体
共用体 a b c 公用同一块空间
注意:
1. 共用体 本身 使用的空间 只要得能放得下最大成员
共用体的大小?
2. 共用体变量初始化,值默认给到第一个成员变量
3. 用共用体 检测电脑大小端
4. 共用体中 各个成员变量 起始地址相同
5. 共用体空间的数据,最终结果
取决 一开始有什么
以及 最后一次给的是什么
枚举
如果一个变量只有几种可能的值,则可以定义为枚举类型。
所谓"枚举"是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
语法:
enum 枚举类型名
{
枚举常量名1,
枚举常量名2,
枚举常量名3,
};
C语言中实现的时候,枚举按照int型处理的 --- 本质上看,就是一个int型数据
//提高代码可读性
//有类型 提高代码的语法检查
对比:
#define //预处理 --
//文本原样替换 --- 不存在类型
//枚举有类型 -- 有更严格语法检测