指针
概念说明
指针本质上是保存地址的变量。 通过指针,程序可以间接访问另一块内存中的数据,这也是 C 语言能高效操作数组、字符串和动态内存的关键原因。
理解指针时,最好分清三件事:
- 变量自己的值。
- 变量的地址。
- 指针里保存的地址。
这三者混在一起时,很多指针题看起来就会很乱。 一旦把它们拆开理解,指针其实只是“先拿地址,再通过地址访问数据”的过程。
语法/规则
- 取地址运算符是
&,解引用运算符是*。 - 指针定义形式是
类型 *指针名;,例如int *p;。 - 指针类型应和目标对象类型匹配,否则解引用结果可能错误。
- 空指针通常写作
NULL,在使用前应先判断是否为空。 void *可以保存任意对象地址,但在解引用前通常需要先转换成具体类型。- 指针加减法的步长由它指向的数据类型决定,例如
int *p每次p + 1会跨过一个int。 - 指针运算和比较应尽量限定在同一数组或同一对象范围内,超出范围会非常危险。
示例
| |
输出结果:
| |
这个例子既展示了“通过指针修改外部变量”,也展示了“数组名退化为指针后可参与指针运算”的常见用法。
常见错误
- 指针变量声明了却没有初始化,就直接解引用使用。
- 取地址和解引用混淆,例如该写
&x时写成了x。 - 以为所有指针都能随意强转后正常使用,忽略了类型、对齐和对象真实布局的风险。
free之后继续使用旧指针,或者返回了已经失效局部对象的地址。- 指针运算超出了原有数组边界,却还把结果当成合法地址继续访问。