前文主要介绍了C语言从零开始学习的基本框架与基础知识导览,本文主要补充此前未提及的学习内容,给有意精进C语言者指明一条可供参考的学习路径。
补充一:动态内存管理
-
核心函数(需
#include <stdlib.h>):-
malloc(size):申请size字节的连续内存,返回首地址(类型为void*)。 -
calloc(n, size):申请n*size字节内存,并初始化为0。 -
realloc(ptr, new_size):调整已分配内存块大小。 -
free(ptr):释放内存,防止内存泄漏。
-
-
示例:
int *arr = (int*)malloc(5 * sizeof(int)); // 动态数组 if (arr == NULL) exit(1); // 检查分配成功 arr[0] = 10; free(arr); // 释放内存
补充二:枚举类型(enum)
-
定义与使用:
enum Weekday {Sun=7, Mon=1, Tue, Wed}; // Tue自动=2 enum Weekday day = Mon; // day值为1-
用途:提高代码可读性,限定变量取值范围。
-
补充三:类型定义(typedef)
-
作用:为现有类型创建别名。
typedef int Integer; // Integer 是 int 别名 typedef struct Node { // 简化结构体声明int data;struct Node *next; } Node; Node n; // 直接使用别名
补充四:位运算
-
运算符:
-
&(按位与)、|(按位或)、^(按位异或) -
~(按位取反)、<<(左移)、>>(右移)
-
-
应用场景:
-
硬件控制:
PORT |= 0x01;(设置最低位为1) -
数据压缩:用位存储多个布尔值。
-
示例:
a = b << 2;→b左移2位(等价于b*4)。
-
补充五:命令行参数
-
main函数参数:
int main(int argc, char *argv[]) {// argc: 参数个数(至少为1,程序名本身)// argv: 参数字符串数组printf("程序名: %s\n", argv[0]);if (argc > 1) printf("第一个参数: %s\n", argv[1]); }-
执行:
./program arg1 arg2 → argc=3, argv[1]="arg1"。
-
补充六:const关键字
-
作用:
-
定义常量:
const int MAX=100;(值不可修改) -
保护指针:
const int *p = &a; // *p只读(指向的值不可改) int *const p = &a; // p只读(指向不可改)
-
补充七:预处理器高级用法
-
条件编译:
#ifdef DEBUG // 若定义了DEBUG宏printf("调试信息"); #endif -
预定义宏:
-
__LINE__:当前行号 -
__FILE__:当前文件名 -
__DATE__:编译日期
-
补充八:联合体(union)
-
特点:所有成员共享同一内存空间(大小为最大成员的大小)。
-
应用:节省内存,同一时间只存储一个成员值。
union Data {int i;float f;char str[20]; }; union Data d; d.i = 10; // 此时d.f和d.str无意义
补充九:文件定位函数
-
核心函数:
-
fseek(fp, offset, whence):移动文件指针。-
whence:SEEK_SET(文件头)、SEEK_CUR(当前位置)、SEEK_END(文件尾)。
-
-
ftell(fp):返回当前文件指针位置。 -
rewind(fp):重置指针到文件头。
-
-
示例:
fseek(fp, 10, SEEK_SET); // 定位到文件头后第10字节 long pos = ftell(fp); // 获取当前位置
关键总结:
动态内存管理是C语言核心难点,需严格配对
malloc/free。位运算在嵌入式开发中至关重要。
const和typedef提升代码健壮性和可读性。
联合体在协议解析、类型转换中高效实用。
文件定位实现随机读写,突破顺序访问限制。