Skip to content
📖 Auto 版 Modern C本书目录

第十一章:指针 ​

级别 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])   // 直接索引,无指针

基于 MIT 许可发布。