这个比上一个详细一点
如有遗漏欢迎补充
1. 基础语法与程序结构
1.1 程序基本框架
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b);
int main(void) {
printf("Hello World\n");
int result = add(5, 3);
return 0;
}
int add(int a, int b) {
return a + b;
}
1.2 编译执行流程
2. 数据类型系统完整表
2.1 基本数据类型对比表
| 类型 | 大小(字节) | 取值范围 | 格式符 | 备注 |
|---|
| char | 1 | -128~127 | %c, %hhd | 字符类型 |
| unsigned char | 1 | 0~255 | %c, %hhu | 无符号字符 |
| short | 2 | -32768~32767 | %hd | 短整型 |
| unsigned short | 2 | 0~65535 | %hu | 无符号短整型 |
| int | 4 | -2³¹~2³¹-1 | %d | 整型(常用) |
| unsigned int | 4 | 0~2³²-1 | %u | 无符号整型 |
| long | 8 | -2⁶³~2⁶³-1 | %ld | 长整型 |
| unsigned long | 8 | 0~2⁶⁴-1 | %lu | 无符号长整型 |
| float | 4 | ±3.4e±38 | %f | 单精度浮点 |
| double | 8 | ±1.7e±308 | %lf | 双精度浮点 |
| long double | 16 | ±1.1e±4932 | %Lf | 扩展精度 |
| _Bool | 1 | 0/1 | %d | C99布尔型 |
| void | - | - | - | 空类型 |
2.2 数据类型转换规则
自动转换方向:char → short → int → long → float → double
强制转换语法:(目标类型)表达式
3. 运算符完整分类表
3.1 运算符优先级总表(从高到低)
| 优先级 | 运算符 | 描述 | 结合性 |
|---|
| 1 | () [] -> . | 函数调用、数组下标、成员访问 | 左→右 |
| 2 | ! ~ ++ – + - * & sizeof | 单目运算符 | 右→左 |
| 3 | * / % | 乘除取模 | 左→右 |
| 4 | + - | 加减 | 左→右 |
| 5 | << >> | 移位 | 左→右 |
| 6 | < <= > >= | 关系比较 | 左→右 |
| 7 | == != | 相等判断 | 左→右 |
| 8 | & | 位与 | 左→右 |
| 9 | ^ | 位异或 | 左→右 |
| 10 | | | 位或 | 左→右 |
| 11 | && | 逻辑与 | 左→右 |
| 12 | || | 逻辑或 | 左→右 |
| 13 | ?: | 条件运算符 | 右→左 |
| 14 | = += -= *= /= %=等 | 赋值运算符 | 右→左 |
| 15 | , | 逗号运算符 | 左→右 |
4. 流程控制结构详解
4.1 分支结构对比
if (condition1) {
} else if (condition2) {
} else {
}
switch (expression) {
case constant1:
break;
case constant2:
break;
default:
}
4.2 循环结构对比
for (初始化; 条件; 更新) {
}
while (条件) {
}
do {
} while (条件);
5. 函数编程完整体系
5.1 函数定义与调用
返回类型 函数名(参数列表);
返回类型 函数名(参数列表) {
return 返回值;
}
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
5.2 参数传递方式
| 方式 | 语法 | 特点 | 适用场景 |
|---|
| 值传递 | func(int a) | 形参是实参副本 | 不需要修改实参 |
| 地址传递 | func(int *a) | 通过指针修改实参 | 需要修改实参 |
| 数组传递 | func(int arr[]) | 传递数组首地址 | 处理数组数据 |
| 结构体传递 | func(struct s) | 可值可地址 | 复杂数据结构 |
6. 数组与字符串完整处理
6.1 多维数组内存布局
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
6.2 字符串函数大全
#include <string.h>
strlen(str);
strcpy(dest, src);
strcat(dest, src);
strcmp(s1, s2);
strncpy(dest, src, n);
strncat(dest, src, n);
strncmp(s1, s2, n);
memcpy(dest, src, n);
memmove(dest, src, n);
memset(ptr, value, n);
memcmp(ptr1, ptr2, n);
7. 指针系统完整解析
7.1 指针类型层次图
7.2 复杂声明解读规则
int *p;
int *p[10];
int (*p)[10];
int (*p)(int);
int (*p[5])(int);
int (*(*p)[5])(int);
8. 内存管理完整方案
8.1 内存区域分布表
| 内存区域 | 存储内容 | 生命周期 | 管理方式 |
|---|
| 代码区 | 程序指令 | 程序运行期 | 系统管理 |
| 常量区 | 字符串常量 | 程序运行期 | 只读 |
| 全局区 | 全局/静态变量 | 程序运行期 | 系统管理 |
| 堆区 | 动态分配内存 | 手动控制 | malloc/free |
| 栈区 | 局部变量 | 函数调用期 | 自动管理 |
8.2 动态内存函数对比
| 函数 | 原型 | 特点 | 使用场景 |
|---|
| malloc | void* malloc(size_t) | 分配未初始化内存 | 通用内存分配 |
| calloc | void* calloc(size_t, size_t) | 分配并清零内存 | 数组初始化 |
| realloc | void* realloc(void*, size_t) | 调整内存大小 | 动态数组扩容 |
| free | void free(void*) | 释放内存 | 必须配对使用 |
9. 结构体与联合体深度解析
9.1 结构体对齐规则
struct Example {
char a;
int b;
char c;
};
9.2 位字段应用
struct Status {
unsigned int error : 1;
unsigned int ready : 1;
unsigned int mode : 2;
unsigned int : 4;
unsigned int value : 8;
};
10. 预处理器与宏编程
10.1 条件编译模式
#define DEBUG 1
#define VERSION 2
#if DEBUG
#define DBG_PRINT(x) printf("Debug: %s\n", x)
#else
#define DBG_PRINT(x)
#endif
#ifdef WINDOWS
#include <windows.h>
#elif defined(LINUX)
#include <unistd.h>
#else
#error "Unsupported platform"
#endif
10.2 高级宏技巧
#define STRINGIFY(x) #x
#define CONCAT(a, b) a##b
#define LOG(format, ...) printf(format, __VA_ARGS__)
#define MAX(a, b) ((a) > (b) ? (a) : (b))
11. 标准库函数分类总结
11.1 主要头文件功能
| 头文件 | 主要功能 | 重要函数 |
|---|
| stdio.h | 输入输出 | printf, scanf, fopen, fclose |
| stdlib.h | 通用工具 | malloc, free, exit, rand |
| string.h | 字符串处理 | strlen, strcpy, strcmp |
| math.h | 数学函数 | sqrt, sin, cos, pow |
| time.h | 时间日期 | time, localtime, strftime |
| ctype.h | 字符分类 | isalpha, isdigit, toupper |
12. 文件操作完整流程
12.1 文件操作模式表
| 模式 | 读 | 写 | 创建 | 截断 | 文件位置 |
|---|
| “r” | ✓ | ✗ | ✗ | ✗ | 开头 |
| “w” | ✗ | ✓ | ✓ | ✓ | 开头 |
| “a” | ✗ | ✓ | ✓ | ✗ | 结尾 |
| “r+” | ✓ | ✓ | ✗ | ✗ | 开头 |
| “w+” | ✓ | ✓ | ✓ | ✓ | 开头 |
| “a+” | ✓ | ✓ | ✓ | ✗ | 结尾 |
13. C99/C11新特性汇总
13.1 重要新特性
#include <stdbool.h>
bool flag = true;
int arr[10] = {[0] = 1, [5] = 2, [9] = 3};
struct Point p = {.x = 10, .y = 20};
void func(int n) {
int vla[n];
}
_Static_assert(sizeof(int) == 4, "int must be 4 bytes");
14. 错误处理与调试体系
14.1 系统化错误处理
#include <errno.h>
#include <string.h>
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
fprintf(stderr, "Error %d: %s\n", errno, strerror(errno));
switch (errno) {
case ENOENT: printf("File not found\n"); break;
case EACCES: printf("Permission denied\n"); break;
default: printf("Unknown error\n");
}
}
14.2 调试技术栈
#define DEBUG 1
#if DEBUG
#define DBG(fmt, ...) printf("[%s:%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#else
#define DBG(fmt, ...)
#endif
#include <assert.h>
assert(ptr != NULL);
void log_message(const char *level, const char *format, ...);
15. 编程规范与最佳实践
15.1 代码规范要点
- 命名规范: 变量小写驼峰,常量全大写,函数动词开头
- 注释规则: 文件头注释、函数注释、重要代码段注释
- 缩进风格: 4空格缩进,统一大括号位置
- 函数设计: 单一职责,不超过50行,明确输入输出
15.2 安全编程实践
char buffer[100];
strncpy(buffer, source, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
if (a > INT_MAX - b) {
} else {
result = a + b;
}
16. 跨平台开发注意事项
16.1 可移植性编码
#include <stdint.h>
int32_t fixed_size_int;
uint64_t large_unsigned;
int is_little_endian() {
int num = 1;
return *(char *)&num == 1;
}
#ifdef _WIN32
#define PATH_SEPARATOR '\\'
#else
#define PATH_SEPARATOR '/'
#endif
完~~~