第 2 章:指针与内存管理
学习目标
- 深入理解指针
- 掌握动态内存管理
- 避免常见内存错误
2.1 指针基础
int x = 10;
int *p = &x; // p 指向 x
*p = 20; // 通过指针修改 x
printf("x = %d\n", x); // 20
printf("&x = %p\n", &x); // 地址
printf("p = %p\n", p); // 地址
printf("*p = %d\n", *p); // 20
2.2 数组与指针
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 数组名即指针
// 等价访问
arr[2] == *(arr + 2) == *(p + 2) == p[2]
2.3 动态内存
#include <stdlib.h>
// 分配内存
int *p = (int*)malloc(10 * sizeof(int));
if (p == NULL) {
// 处理错误
}
// 使用内存
for (int i = 0; i < 10; i++) {
p[i] = i;
}
// 释放内存
free(p);
p = NULL; // 避免悬空指针
2.4 常见错误
// 1. 内存泄漏
int *p = malloc(100);
// 忘记 free(p)
// 2. 悬空指针
int *p = malloc(100);
free(p);
*p = 10; // 错误!
// 3. 越界访问
int arr[10];
arr[10] = 0; // 错误!
实践练习
实现动态数组(可自动扩容)。