4.3 指针

本篇学习地址、解引用、指针运算、空指针和 `void *` 的基础规则,并能用指针操作数组和外部变量。

指针

概念说明

指针本质上是保存地址的变量。 通过指针,程序可以间接访问另一块内存中的数据,这也是 C 语言能高效操作数组、字符串和动态内存的关键原因。

理解指针时,最好分清三件事:

  • 变量自己的值。
  • 变量的地址。
  • 指针里保存的地址。

这三者混在一起时,很多指针题看起来就会很乱。 一旦把它们拆开理解,指针其实只是“先拿地址,再通过地址访问数据”的过程。

语法/规则

  1. 取地址运算符是 &,解引用运算符是 *
  2. 指针定义形式是 类型 *指针名;,例如 int *p;
  3. 指针类型应和目标对象类型匹配,否则解引用结果可能错误。
  4. 空指针通常写作 NULL,在使用前应先判断是否为空。
  5. void * 可以保存任意对象地址,但在解引用前通常需要先转换成具体类型。
  6. 指针加减法的步长由它指向的数据类型决定,例如 int *p 每次 p + 1 会跨过一个 int
  7. 指针运算和比较应尽量限定在同一数组或同一对象范围内,超出范围会非常危险。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(void) {
    int x = 3;
    int y = 8;
    int nums[3] = {10, 20, 30};
    int *p = nums;

    swap(&x, &y);

    printf("x = %d\n", x);
    printf("y = %d\n", y);
    printf("second = %d\n", *(p + 1));
    return 0;
}

输出结果:

1
2
3
x = 8
y = 3
second = 20

这个例子既展示了“通过指针修改外部变量”,也展示了“数组名退化为指针后可参与指针运算”的常见用法。

常见错误

  1. 指针变量声明了却没有初始化,就直接解引用使用。
  2. 取地址和解引用混淆,例如该写 &x 时写成了 x
  3. 以为所有指针都能随意强转后正常使用,忽略了类型、对齐和对象真实布局的风险。
  4. free 之后继续使用旧指针,或者返回了已经失效局部对象的地址。
  5. 指针运算超出了原有数组边界,却还把结果当成合法地址继续访问。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字