写C或C++代码时,常会看到 ptr++ 这样的写法。如果刚接触指针,可能会纳闷:这到底是在加什么?其实,指针自增并不是简单地把地址数值加1,而是根据它指向的数据类型,跳到下一个“合适”的位置。
指针的本质是地址
假设你有一个整型变量 int a = 10;,然后定义一个指针指向它:int* ptr = &a;。此时 ptr 存的是变量 a 的内存地址。当你执行 ptr++,指针并不会只加1个字节,而是加上它所指向类型的大小。
自增的步长由类型决定
比如在大多数系统中,int 占4个字节。那么 ptr++ 实际上会让地址增加4。也就是说,原来指向地址 1000,自增后就变成 1004。如果是 double* 类型的指针,double 通常占8字节,自增一次就加8。
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30};
int* ptr = arr; // 指向数组首元素
printf("地址 %%p, 值 %%d\n", ptr, *ptr);
ptr++; // 指针自增,跳到下一个int
printf("地址 %%p, 值 %%d\n", ptr, *ptr);
return 0;
}
上面这段代码输出的结果中,两个地址差了4(假设int为4字节),而第二个值正好是数组的第二个元素20。这就是指针自增的实际用途——遍历数组不用下标,靠移动指针就能取到下一个元素。
和数组的关系很紧密
很多人说“数组名就是指针”,虽然不完全准确,但在访问时确实可以互换使用。比如 arr[i] 其实等价于 *(arr + i)。当你用指针遍历数组时,每次自增,就是在“前进一格”,逻辑清晰,效率也高。
注意别越界
指针自增很方便,但也容易出问题。比如数组只有5个元素,你从头开始一路自增到第6个,就会读到不属于这个数组的内存。轻则数据错乱,重则程序崩溃。所以用的时候得心里有数,最好配合循环条件控制好范围。
日常开发中,像处理字符串、操作缓冲区、解析二进制数据这些场景,指针自增非常常见。理解它不只是看懂语法,更是掌握一种高效操作内存的方式。