`+1`、`a + 1` 与 `&a + 1`
2026/8/19大约 1 分钟
+1、a + 1 与 &a + 1
一、指针 +1 到底移动多少?
关键:
指针
+1移动的是它所指向的数据类型大小,而不是指针本身的大小。
char *p1 = (char *)0x1000;
int *p2 = (int *)0x1000;假设:
char = 1 字节
int = 4 字节那么:
p1 + 1 // 0x1001,移动 1 字节
p2 + 1 // 0x1004,移动 4 字节所以:
p + n = 当前地址 + n × sizeof(*p)注意:
sizeof(p)是指针本身的大小;
而:
p + 1看的是指针指向的数据大小。
二、a + 1 和 &a + 1
int a[5] = {1,2,3,4,5};a + 1
数组名 a 通常退化成 int *:
a → a[0]所以:
a + 1指向:
a[1]也就是移动 1 个 int。
*(a + 1) // 2&a + 1
&a 是整个数组的地址,类型是:
int (*)[5]所以:
&a + 1移动的是整个 int[5] 数组。
如果 int = 4 字节:
5 × 4 = 20 字节三、经典题
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d, %d", *(a + 1), *(ptr - 1));结果:
2, 5原因:
*(a + 1) // a[1] = 2而:
&a + 1 // 整个数组后面
ptr - 1 // 回到最后一个 int
*(ptr - 1) // a[4] = 5四、最终记忆
p + 1
↓
移动 1 个“指向的对象”
a + 1
↓
下一个数组元素
&a + 1
↓
下一个完整数组不要看指针有多大,要看指针指向的对象有多大。

