一、C语言基础语法体系
1.1 数据类型与变量声明
C语言提供基本数据类型(int/float/double/char)及派生类型(数组/指针/结构体)。变量声明需指定类型与存储类别,如static int count;实现生命周期延长,const float PI=3.14;定义常量。类型转换分为隐式转换(如int a=5; float b=a;)和显式转换((int)3.14),需注意精度损失问题。
1.2 运算符优先级与表达式
运算符按优先级分为15级,算术运算符(+ - * / %)优先级高于关系运算符(> < == !=)。自增自减运算符(++a与a++)在表达式中的行为差异显著,例如:
int a=5, b;b = a++ + 2; // b=7, a=6b = ++a + 2; // a=6, b=8
复合赋值运算符(+= -= *= /=)可简化表达式,如x *= y + 1等价于x = x * (y + 1)。
二、程序控制结构
2.1 条件分支语句
if-else结构支持嵌套,但深度超过3层会降低可读性。switch-case适用于多分支场景,需注意break语句的缺失会导致case穿透:
switch(grade) {case 'A': printf("Excellent"); break;case 'B': printf("Good"); // 无break会继续执行case 'C'case 'C': printf("Pass"); break;default: printf("Fail");}
2.2 循环控制机制
for循环适合已知次数场景,while与do-while用于不确定次数。循环控制语句break(立即退出)和continue(跳过本次)需谨慎使用,避免造成逻辑混乱。嵌套循环中,内层循环的break仅退出当前层。
三、函数与模块化编程
3.1 函数定义与调用
函数声明需指定返回类型、函数名及参数列表,如int max(int a, int b)。参数传递分为值传递(创建副本)和指针传递(直接操作原变量)。递归函数需设定终止条件,例如阶乘计算:
int factorial(int n) {if(n==0) return 1;return n * factorial(n-1);}
3.2 变量作用域与生命周期
局部变量存储于栈区,函数调用结束后释放;全局变量存储于静态存储区,整个程序运行期间存在。静态局部变量(static int count=0;)仅初始化一次,保持函数调用间的值。
四、指针与内存管理
4.1 指针基础操作
指针存储内存地址,*为解引用运算符。指针算术运算以指向类型大小为步长,如int *p; p++实际增加4字节(32位系统)。空指针(NULL)和野指针需特别处理,访问空指针会导致段错误。
4.2 动态内存分配
malloc/calloc/realloc用于堆内存分配,需配套free释放。示例:
int *arr = (int*)malloc(10*sizeof(int));if(arr==NULL) { /* 错误处理 */ }free(arr); // 释放后应置空arr = NULL;
内存泄漏常见于未释放或重复释放,建议使用工具如Valgrind检测。
五、高级数据结构
5.1 数组与字符串处理
一维数组通过下标访问,二维数组按行优先存储。字符串以\0结尾,标准库函数(strlen/strcpy/strcat)不检查目标缓冲区大小,建议使用安全版本(strncpy)。
5.2 结构体与联合体
结构体组合不同类型数据,联合体共享内存空间。位域(bit-field)可精确控制成员位数:
struct Date {unsigned int day : 5; // 5位足够存储1-31unsigned int month : 4;unsigned int year : 11;};
六、文件操作与预处理
6.1 文件I/O操作
标准库提供fopen/fread/fwrite/fclose等函数,模式字符串("r"/"w"/"a")决定打开方式。二进制模式("rb")与文本模式("r")在换行符处理上有差异。
6.2 预处理指令
宏定义(#define PI 3.14)需注意括号保护,如#define SQUARE(x) ((x)*(x))。条件编译(#ifdef DEBUG)可实现代码选择性编译,头文件保护(#ifndef HEADER_H)防止重复包含。
七、实战开发建议
- 调试技巧:使用GDB分步调试,结合
printf输出中间变量 - 代码规范:遵循K&R缩进风格,变量名采用小写加下划线
- 性能优化:减少函数调用开销,优先使用局部变量
- 安全实践:对用户输入进行边界检查,避免缓冲区溢出
本总结覆盖C语言核心知识点,建议结合《C程序设计语言(第二版)》等经典教材深入学习,通过LeetCode等平台实践算法题,逐步构建完整的编程知识体系。