【学习C语言的第三天】

结构体/联合/枚举

  • 结构体复合数据类型

  • 看作不同类型变量的集合

定义结构体类型
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 *));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值