结构体/联合/枚举
-
结构体复合数据类型
-
看作不同类型变量的集合
定义结构体类型
struct 结构体名 { type member; //成员变量 //... };
-
定义结构体类型时,并不会给成员变量分配内存空间
定义结构体变量
struct STRUCT_NAME var_name;
结构体变量初始化
-
{} 初始化器,只有在初始化时才能使用{},后续不能使用{}赋值
struct STRUCT_NAME var_name = {v1,v2,...}; //跟成员的定义顺序一致 {.member = v1,....}
结构体成员访问
-
.运算符
-
结构体变量名.成员名
结构体指针 和 ->
-
结构体指针变量访问成员可以直接使用->
-
(*pstu).no pstu->no
柔性数组
struct A{ int n; int arr[]; // int arr[0] 柔性数组 };
结构体大小
对齐/补齐
-
对齐摆放
-
补齐大小
联合/共用体
-
所有成员共享同一块内存
-
union
计算机存储
大端/小端(多字节的整数)
-
小端 : 基本上PC采用的存储方式
-
低地址存储低字节,高地址存储高字节数据 (与阅读和书写相悖)
-
-
大端: 网络传输和网络设备存储方式
-
低地址存储高字节,高地址存储低字节数据
-
与阅读和书写习惯一样
-
枚举
-
enum
-
所谓枚举,加了数值范围的整数(少且可以穷尽例举)
文件操作
-
内存,虚拟内存,程序结整,内存回收,数据消失
-
文件操作函数
//打开文件 fopen 打开方式: r/r+/w/w+/a/a+ t/b text binary //关闭文件 fclose //文件格式化读写 fprintf fscanf //二进制读写 fwrite fread //字符串读写 fputs fgets //字符读写 fputc fgetc //文件读写位置 ftell fseek SEEK_SET/SEEK_CUR/SEEK_END rewind rename access truncate
-
直接删除文件中的数据
-
文件删除一部分内容,后面的内容不会补上来,需要编程实现,把后面的数据往前移,使用truncate函数把文件截取
-
在项目过程中,要删除数据,不一定非得把数据从文件中删除,可以在设计时,给每个数据加一个标识,是否删除的标记
-
-
头文件
-
头文件卫士 / 防止头文件被重复引入
-
类型的定义
-
typedef类型别名
-
struct/enum/union
-
-
宏的定义
-
全局变量的声明 [extern]
-
全局函数的声明 [extern可以省]
-
静态变量的定义/静态函数的定义
-
-
实现文件 .c
-
全局变量的定义
-
全局函数的定义/实现
-
-
一个头文件一般会对应一个.c实现文件
-
同类的操作会放在同一个.h/.c中
-
如标准库 string.h 关于字符串的操作
-
-
编译步骤
-
每当编写完一个.h/.c之后,应该检查单个文件的语法错误
# gcc -c .h/.c
-
.h文件通过编译之后,如果没有语法错误,生成.h.gch 要记得删除
-
在#include 某个头文件时,如果有该头文件.gch文件,则会直接使用.gch文件,万一.h文件是修改过的,但又没有重新编译,则修改是无效的
-
-
.c文件通过编译之后,如果没有语法错误,生成.o文件 .o可以删除/保存
-
-
-
软件设计框架
-
多文件
-
分层(UI: 字符界面/图形界面 存储:文件存储/数据库存储)
-
高内聚/低耦合 减少代码与代码之间的联系
-
解耦
-
main.c ---- 项目程序的入口 main函数 //整个程序的循环事件 框架 显示界面 读取用户操作 并作出响应 stucore.h stucore.c //用户界面层 字符界面 只有在这层中的代码可以使用scanf/printf stuview.h stuview.c //数据对象层 定义了结构体类型名称 stu.h //逻辑实现层 stuimpl.h stuimpl.c int newStuNo(); bool addStuImpl(const struct Stu *); bool findStuByNoImpl(int,struct Stu *,long *); bool updateStuImpl(struct Stu *,long ); bool findStuByNameImpl(const char *,struct Stu **,size_t *); size_t foreachStuImpl(void (*func)(const struct Stu *));