前文主要介绍了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提升代码健壮性和可读性。
联合体在协议解析、类型转换中高效实用。
文件定位实现随机读写,突破顺序访问限制。