C语言完整知识体系总览

这个比上一个详细一点
如有遗漏欢迎补充

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 编译执行流程

源代码.c
预处理
编译
汇编
链接
可执行文件

2. 数据类型系统完整表

2.1 基本数据类型对比表

类型大小(字节)取值范围格式符备注
char1-128~127%c, %hhd字符类型
unsigned char10~255%c, %hhu无符号字符
short2-32768~32767%hd短整型
unsigned short20~65535%hu无符号短整型
int4-2³¹~2³¹-1%d整型(常用)
unsigned int40~2³²-1%u无符号整型
long8-2⁶³~2⁶³-1%ld长整型
unsigned long80~2⁶⁴-1%lu无符号长整型
float4±3.4e±38%f单精度浮点
double8±1.7e±308%lf双精度浮点
long double16±1.1e±4932%Lf扩展精度
_Bool10/1%dC99布尔型
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-else if-else
if (condition1) {
    // 代码块1
} else if (condition2) {
    // 代码块2
} else {
    // 代码块3
}

// switch-case
switch (expression) {
    case constant1:
        // 代码块
        break;
    case constant2:
        // 代码块
        break;
    default:
        // 默认代码块
}

4.2 循环结构对比

// for循环
for (初始化; 条件; 更新) {
    // 循环体
}

// while循环
while (条件) {
    // 循环体
}

// do-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}
};
// 内存排列: 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);     // 字符串比较

// 安全版本(n限制)
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;                 // p是指向int的指针
int *p[10];             // p是10个int指针的数组
int (*p)[10];           // p是指向10个int数组的指针
int (*p)(int);          // p是函数指针,函数接受int返回int
int (*p[5])(int);       // p是5个函数指针的数组
int (*(*p)[5])(int);    // p是指向5个函数指针数组的指针

8. 内存管理完整方案

8.1 内存区域分布表

内存区域存储内容生命周期管理方式
代码区程序指令程序运行期系统管理
常量区字符串常量程序运行期只读
全局区全局/静态变量程序运行期系统管理
堆区动态分配内存手动控制malloc/free
栈区局部变量函数调用期自动管理

8.2 动态内存函数对比

函数原型特点使用场景
mallocvoid* malloc(size_t)分配未初始化内存通用内存分配
callocvoid* calloc(size_t, size_t)分配并清零内存数组初始化
reallocvoid* realloc(void*, size_t)调整内存大小动态数组扩容
freevoid free(void*)释放内存必须配对使用

9. 结构体与联合体深度解析

9.1 结构体对齐规则

struct Example {
    char a;     // 偏移0, 大小1
    // 填充3字节
    int b;      // 偏移4, 大小4
    char c;     // 偏移8, 大小1
    // 填充3字节,总大小12
};

9.2 位字段应用

struct Status {
    unsigned int error : 1;    // 1位:错误标志
    unsigned int ready : 1;    // 1位:就绪标志  
    unsigned int mode : 2;     // 2位:模式选择
    unsigned int : 4;          // 4位:保留
    unsigned int value : 8;    // 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];  // C99变长数组
}

// 静态断言
_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 调试技术栈

// 1. 打印调试
#define DEBUG 1
#if DEBUG
    #define DBG(fmt, ...) printf("[%s:%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#else
    #define DBG(fmt, ...)
#endif

// 2. 断言调试
#include <assert.h>
assert(ptr != NULL);

// 3. 日志系统
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
																完~~~
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值