结构体类型(构造类型——用户自定义类型):用来描述复杂数据的一种数据类型。
结构体
结构体是一种用于描述复杂数据的用户自定义数据类型。
语法:
struct 结构体名
{成员列表;
} ;
struct
关键字:表示正在构造一个结构体类型。- 结构体名:用于描述结构体类型的名称。
- 成员列表:包含要描述的复杂数据中用到的具体成员变量,定义方式与普通变量相同,多个成员变量之间用分号隔开,最后有一个分号表示结束。
例如:
struct student
{char name[30]; int sno;float score;char sex;
};
定义变量:
struct 结构体名 变量名;
初始化:
struct student s = {};
按照成员变量的数据类型依次初始化。
结构体变量的引用:
使用 结构体变量名.成员名
访问成员。
结构体类型的定义形式:
- 先定义类型,然后定义变量:
struct demo
{};
struct demo d;
- 定义类型的同时,定义变量:
struct demo
{
}d;
- 定义类型的同时,定义变量且省略结构体名(结构体类型只用一次):
struct
{
}d;
结构体类型的大小:
在 32 位平台上,默认按 4 字节对齐。对于成员变量,各自在自己的自然边界上对齐。如果成员变量中有比 4 字节大的,整个结构体按 4 字节对齐;如果没有,则按最大的成员对齐。
在 64 位平台上,如果超过 4 字节的,按超过的最大的成员变量对齐;如果没有超过 4 字节的,则按成员变量中最大对齐。
同类型的结构体变量之间可以相互赋值。
#include <stdio.h>// 定义一个名为 student 的结构体
struct student
{int sno; // 学号char name[10]; // 姓名int sex; // 性别(0 表示女,1 表示男)float score; // 成绩
};int main(int argc, const char *argv[])
{// 定义并初始化一个名为 s 的 student 类型结构体变量struct student s = {110,"tom",1,59.9};// 打印学号printf("sno = %d\n",s.sno);// 打印姓名printf("name = %s\n",s.name);// 打印性别printf("sex = %d\n",s.sex);// 打印成绩,保留两位小数printf("score = %.2f\n",s.score);// 定义并初始化一个名为 s 的 student 类型结构体数组,包含 3 个元素struct student s[3] = {{110,"tom",1,59.9},{111,"tony",0,81.2},{112,"jack",1,94.1}};// 计算并打印数组中三个元素的成绩平均值,保留两位小数printf("%.2f\n",(s[0].score+s[1].score+s[2].score)/3);// 分别定义并初始化三个 student 类型结构体变量 s1、s2、s3struct student s1 = {110,"tom",1,59.9};struct student s2 = {111,"tony",0,81.2};struct student s3 = {112,"jack",1,94.1};// 计算并打印这三个变量的成绩平均值printf("%f\n",(s1.score+s2.score+s3.score)/3);return 0;
}
qsort 函数
void qsort(void *base, //要排序的数组的首地址 size_t nmemb, //数组元素的个数 size_t size, //单个元素的大小 int (*compar)(const void *, const void *) //比较函数 --- 提供比较依据
);
比较函数:
int compar(const void *a, const void *b)
{ // 比较逻辑
}
共用体
语法:
union 共用体名
{成员变量;
};
例如:
union demo
{char a;short b;int c;
};
共用体特点:
共用一块内存空间,共用了最大成员的空间。
注意事项:
- 共用体初始化时,只能给一个值,默认给到第一个成员。
- 共用体变量中的值取决于最后一次给到的值,还要看能影响几个字节。
对比结构体:
- 结构体中各个成员拥有自己独立空间。
- 共用体中,成员共用一块空间。
考点:用共用体判断大小端。例如通过判断共用体中不同类型成员的存储顺序来确定大小端模式
枚举
枚举是将变量的值一一列举出来,以提高代码可读性和安全性。
语法:
enum 枚举名
{列举各种值 //枚举元素//枚举常量
};
例如:
enum fire
{LITTLE_FIRE,MIDDILE_FIRE, LARGE_FIRE,
};
枚举的特点:
- 列举的值默认从 0 开始,若有给定值,则后续未给定值的枚举元素依次加 1。
- 枚举类型本质是
int
类型数据,枚举类型的变量与整型变量通用。
位运算
位运算可以直接操作二进制位,包括:
&
与运算:一假则假,可用于清 0。|
或运算:一真则真,可用于置 1。~
取反运算:真假相对。^
异或运算:相同为 0,不同为 1。
位移运算:
<<
左移:最低位补 0,左移 1 位相当于乘 2。>>
右移:对于有符号类型,右移时最高位补符号位;对于无符号类型,最高位补 0。
函数指针和指针函数
函数指针是指向函数类型的指针,指针函数是返回值为指针类型的函数。
堆空间操作
使用 malloc
函数在堆上开辟空间,使用 free
函数释放堆空间。