c++中指针加1的字节数由其指向类型的sizeof决定:int加1跳4字节,double跳8字节,struct*跳整个结构体大小(含填充),编译器自动按类型缩放,而非固定加1字节。

数组指针加1的字节数由元素类型决定
在C++中,int*、double*、MyStruct* 这类指针加1,不是简单地+1字节,而是按其所指向类型的sizeof值偏移。这是指针算术的核心规则:编译器自动乘上元素大小。
为什么 arr + 1 不等于 (char*)arr + 1
因为指针类型携带了“步长”信息。假设 int arr[5],sizeof(int) 是4:
-
&arr[0] + 1→ 地址增加sizeof(int)= 4 字节,指向&arr[1] -
(char*)&arr[0] + 1→ 地址增加 1 字节,指向arr[0]的第二个字节(可能越界)
错误常发生在强制转成 char* 后忘了还原类型,或误以为所有指针加1都跳1字节。
多维数组名和指针类型容易混淆
比如 int a[3][4]:
-
a类型是int[4]数组类型,退化为int(*)[4](指向含4个int的数组的指针) -
a + 1跳过整个int[4],即sizeof(int) * 4 = 16字节 - 而
&a[0][0] + 1是int*,只跳4字节
用 typeid(T).name() 或编译器警告(如 -Wpointer-arith)可验证实际类型。
自定义类型要小心对齐和填充
结构体指针加1的跨度不等于 sizeof(成员总和),而是 sizeof(整个struct),包含编译器插入的填充字节:
struct S { char a; int b; };
// sizeof(S) 通常是 8(不是 5),所以 S* p; p + 1 跨越 8 字节
若用 offsetof 或 alignas 改变布局,sizeof 会变,指针步长同步变化——这点常被忽略,尤其在内存映射或序列化场景里。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











