指针自增加的是sizeof(ptr)字节,而非固定1字节;int自增通常加4字节,因sizeof(int)在x86_64、arm64等平台多为4。

不是加 1 字节,而是加 sizeof(*ptr) 字节。具体数值取决于指针所指向的类型,而非平台或编译器默认设定。
int* 自增实际移动 4 字节(常见情况)
在绝大多数现代平台(x86_64、ARM64)上,sizeof(int) 是 4,所以 int* p; p++ 会让 p 的值增加 4。这表示它跳到了下一个 元素的起始地址,而不是“下一个字节”。
常见误区是把 p++ 理解成地址 +1,结果导致越界读写或逻辑错乱。比如:
int arr[3] = {1, 2, 3};
int* p = arr;
p++; // p 现在指向 arr[1],地址比原来多了 4
printf("%d", *p); // 输出 2,正确
如果误以为只加 1,就会去读 (char*)p + 1 处的内存,那大概率是 arr[0] 的后半部分,结果未定义。
不同指针类型自增偏移量差异明显
偏移量由 sizeof(T) 决定,和指针变量本身大小(4 或 8 字节)无关:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
char*自增 → +1 字节(sizeof(char) == 1) -
short*自增 → 通常 +2 字节 -
int*自增 → 通常 +4 字节(但非绝对,sizeof(int)可能为 2 或 8,取决于平台/ABI) -
double*自增 → 通常 +8 字节 -
MyStruct*自增 → +sizeof(MyStruct),含填充字节
注意:void* 不支持算术运算(C++ 中非法),必须先转为具体类型指针才能 ++。
指针减法结果是 ptrdiff_t,不是 int
两个同类型指针相减,结果是它们之间“元素个数”,类型为 ptrdiff_t(有符号整型,足够容纳指针差值):
int arr[5]; int* a = &arr[0], *b = &arr[3]; ptrdiff_t n = b - a; // n == 3,不是 12
如果用 int 接收这个结果,在某些大内存场景下可能溢出(如 64 位系统上差值超过 2³¹−1)。打印时应使用 %td 格式符,而非 %d。
真正容易被忽略的是:指针算术始终以“所指类型为单位”,不是字节;而 sizeof 结果依赖于编译器、目标平台和 ABI,不能硬编码为 4 或 8 —— 尤其在跨平台或嵌入式开发中,int 可能是 2 字节,size_t 和 ptrdiff_t 的宽度也未必和指针一致。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










