第十一章:指针
级别 2 — 认知
C 最强大也最危险的特性,以及 Auto 如何消除这种危险。
指针是 C 的标志性特性。它们提供对内存的直接访问,实现高效的数据结构,并支撑每一个重要的 C 程序。它们也是大多数 C 缺陷的根源:空指针解引用、悬空指针、缓冲区溢出和释放后使用错误。
Auto 从用户代码中消除了裸指针,同时保留了它们提供的表达能力。本章深入探讨 C 指针,让你理解 Auto 为你处理了什么。
11.1 指针操作
指针是存储另一个变量地址的变量。C 提供两个基本指针运算符:
&(取地址):获取变量的内存地址*(解引用):访问内存地址处的值
c
// C 深入:基本指针操作
int x = 42;
int *ptr = &x; // ptr 保存 x 的地址
printf("Address: %p\n", (void*)ptr);
printf("Value: %d\n", *ptr); // 解引用:打印 42
*ptr = 99; // 通过指针修改 x
printf("x is now: %d\n", x); // 打印 99指针算术。 指向数组元素的指针支持算术运算:
c
// C 深入:指针算术
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // p 指向 arr[0]
p += 3; // p 现在指向 arr[3]
printf("%d\n", *p); // 打印 40
int diff = p - arr; // 指针减法:3编译器将偏移量乘以 sizeof(int),所以 p += 3 实际上向地址添加了 3 * sizeof(int) 字节。这就是为什么指针算术需要类型化指针——类型决定了元素大小。
Auto 的替代。 Auto 没有指针类型。数组索引替代指针算术:
auto
let arr [5]int = [5]int{10, 20, 30, 40, 50}
print("arr[3]:", arr[3]) // 直接索引,无指针