跳转至

第 3 章:指针与内存

📋 本章概览

项目 内容
学习时长 45 分钟
核心概念 地址、解引用、指针参数、动态内存
核心比喻 指针像写着房间地址的取件单,解引用才是真正取出物品
实践任务 动态创建数组并计算平均值
难度等级 ★★★☆☆

指针不是“神秘的变量”,它只是保存地址的对象。真正重要的是:这个地址是否有效、类型是否匹配、生命周期是否结束。

3.1 取地址和解引用

int value = 42;
int *pointer = &value;

printf("%d\n", *pointer);
*pointer = 43;
printf("%d\n", value);

&value 取得地址,*pointer 访问该地址对应的值。

3.2 用指针修改调用者的数据

void swap(int *left, int *right) {
    int temp = *left;
    *left = *right;
    *right = temp;
}

3.3 动态内存

#include <stdlib.h>

int *values = malloc(3 * sizeof(*values));
if (values == NULL) {
    return 1;
}

values[0] = 10;
free(values);
values = NULL;

每次 malloc 都必须有对应的 free。释放后把指针设为 NULL,可以减少误用悬空指针的风险。

✅ 验证步骤

用 AddressSanitizer 运行程序,验证正常路径会释放内存;故意制造越界或重复释放后,记录工具报告的线索。

📝 本章总结

  • 指针保存地址,解引用才会访问地址对应的值。
  • 动态内存必须成对管理:分配后释放。
  • 释放后避免继续使用原地址。

✏️ 课后练习

使用 malloc 创建一个由用户指定长度的整数数组,读取数据并计算平均值;检查分配失败,并在所有返回路径释放内存。

🔮 下一章预告

下一章会把多个字段组合成结构体,并把数据保存到文件中。