🚀💎🎯⚠️🚨❓❗🔍🧠💭📝🖥️⌨️💻🖥️🐛🐞🔧⚙️🛠️📦🔗🔄🧪🧹📊🔢① ② ③ ... ⑩
❶ ❷ ❸ ... ❿1️⃣ 2️⃣ 3️⃣ ... 🔟🔴 ❶ ❷ ❸🟢 ❶ ❷ ❸◀ ▶ ▲ ▼ ✅✅☑️✔️❌❎⭕
🔘📅📅⏰🕒⏱️⏲️🗓️📆🎨🎉🎈🎁🍀☘️✨🌈🎨🖌️✂️🔨🔣➡️⬅️⬆️⬇️🔁🔃🚫💬💭🔒🔓
🗝️📎✏️🖍️📏🧲🧬🧮💻🅒🅒++🐍☕🟨🟦🧩🌐📡🧠

🧩环境搭建

1. 安装C编译器

1.1.1 安装GCC

1. 安装GCC
    1. 从GCC官网下载GCC安装包
    2. 运行安装包,选择默认选项即可

1.1.2 安装MinGW

1. 安装MinGW
    1. 从MinGW官网下载MinGW安装包
        这里是MinGW的github下载地址:https://github.com/msys2/msys2-installer/releases/
    2. 运行安装包,选择默认选项即可
    3. 安装MinGW的工具链
        1. 打开MinGW的命令行    
        2. 输入以下命令安装工具链
            *pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain*
2. 配置环境变量
    1. 打开环境变量设置
    2. 点击“环境变量”按钮
    3. 在“系统变量”中,找到“Path”变量,点击“编辑”按钮
    4. 添加MinGW的bin目录(如C:\MinGW\bin)到变量值中
    5. 点击“确定”按钮保存

1.1.3 安装Visual Studio Code

1. 安装Visual Studio Code
    1. 从Visual Studio Code官网下载Visual Studio Code安装包
    2. 运行安装包,选择默认选项即可
2. 配置C++环境,安装插件(如C/C++、C/C++ Extension Pack等)
    1. 打开Visual Studio Code
    2. 点击“扩展”按钮
    3. 搜索“C/C++”插件
    4. 点击“安装”按钮安装

1.1.4 点击“重启”按钮重启Visual Studio Code

  1. 重启Visual Studio Code
    类型关键字
    char 字符类型 1字节
    short 短整数类型 2字节
    int 整数类型 2/4字节
    long 长整数类型 4/8字节
    long long 超长整数类型 16字节
    float 单精度浮点数类型 4字节
    double 双精度浮点数类型 8字节
    int、long因不同平台导致占用字节规定不同,具体占用字节需使用sizeof函数进行查看
    运算符优先级表格
    text

📌模块一:指针与内存

1.1 内存模型

1.1.1 程序的内存分区(代码段、数据段、BSS、堆、栈)

1.1.2 栈帧与函数调用过程

1.1.3 变量的作用域与生命周期

1.2 指针的本质

1.2.1 内存地址与指针变量

1.2.2 指针的声明、初始化与解引用

1.2.3 指针类型的作用(步长、访问宽度)

1.2.4 空指针、野指针与悬空指针

1.3 指针算术运算

1.3.1 指针加减整数

1.3.2 指针相减

1.3.3 指针比较

1.4 数组与指针

1.4.1 数组名的本质(退化与例外)

1.4.2 下标运算与指针运算的等价性

1.4.3 多维数组的内存布局与指针访问

1.4.4 指针数组与数组指针

1.5 指针与函数

1.5.1 指针作为函数参数(传址调用)

1.5.2 函数指针的定义与使用

1.5.3 回调函数模式

1.5.4 返回指针的函数(注意生命周期)

模块二:复杂指针与字符串

2.1 多级指针

2.1.1 二级指针的概念与使用

2.1.2 指针数组与二级指针的关系

2.1.3 多级指针的应用场景(如main函数的argv)

2.2 字符串

2.2.1 字符串常量与字符数组

2.2.2 字符串的存储方式与结束标志

2.2.3 标准字符串函数(strlen/strcpy/strcat/strcmp等)

2.2.4 自己动手实现字符串函数

2.2.5 字符串指针数组(char *argv[])

2.3 函数指针高级

2.3.1 复杂函数指针声明解析

2.3.2 函数指针作为结构体成员(模拟C++类)

2.3.3 函数指针表(跳转表)

模块三:结构体与内存管理

3.1 结构体基础

3.1.1 结构体定义与变量声明

3.1.2 结构体成员的访问(点操作符与箭头操作符)

3.1.3 结构体作为函数参数(传值 vs 传指针)

3.2 内存对齐

3.2.1 对齐规则(自然对齐、#pragma pack)

3.2.2 计算结构体大小

3.2.3 使用offsetof宏

3.3 联合体与枚举

3.3.1 联合体的定义与特点

3.3.2 枚举的使用场景

3.4 动态内存管理

3.4.1 malloc / calloc / realloc / free 详解

3.4.2 常见内存错误(内存泄漏、重复释放、越界访问)

3.4.3 内存调试工具(Valgrind 入门)

3.4.4 避免悬空指针的策略

模块四:数据结构与算法

4.1 线性表

4.1.1 顺序表(动态数组)

4.1.2 单链表(创建、插入、删除、反转)

4.1.3 双向链表

4.1.4 循环链表

4.2 栈与队列

4.2.1 顺序栈

4.2.2 链式栈

4.2.3 循环队列(数组实现)

4.2.4 链式队列

4.3 排序算法

4.3.1 冒泡排序

4.3.2 选择排序

4.3.3 插入排序

4.3.4 快速排序(递归与非递归)

4.3.5 归并排序

4.4 查找算法

4.4.1 顺序查找

4.4.2 二分查找(迭代与递归)

模块五:嵌入式常用技术

5.1 位运算

5.1.1 基本位操作(与、或、非、异或、移位)

5.1.2 置位、清零、取反

5.1.3 位域(bit-field)的使用

5.1.4 位运算在嵌入式中的应用(寄存器操作)

5.2 文件IO

5.2.1 标准C文件操作(fopen/fclose/fread/fwrite/fprintf)

5.2.2 文本文件与二进制文件

5.2.3 文件指针定位(fseek/ftell/rewind)

5.2.4 系统调用与标准IO的区别

5.3 预处理与编译链接

5.3.1 宏定义(带参数宏、特殊符号#和##)

5.3.2 条件编译(#ifdef / #ifndef / #if)

5.3.3 头文件保护符(#pragma once vs #ifndef)

5.3.4 多文件编译与Makefile基础

5.3.5 静态库与动态库的制作

模块六:综合项目实践

6.1 项目:简易嵌入式任务调度器

6.1.1 项目需求分析

6.1.2 任务控制块(TCB)设计

6.1.3 任务调度算法(轮询/优先级)

6.1.4 上下文切换模拟

6.1.5 内存管理(任务栈分配)

6.1.6 项目总结与改进

6.2 其他项目备选(可根据兴趣选择)

6.2.1 基于C的图书管理系统(链表+文件)

6.2.2 简易HTTP服务器(socket编程)

6.2.3 贪吃蛇游戏(控制台图形化)

6.2.4 学生成绩管理系统(结构体+文件)