指针加减整数按所指类型大小缩放,如int*加1偏移4字节;同类型指针相减得元素个数,结果为ptrdiff_t类型,仅同一数组内合法。

指针加减整数时,编译器自动按类型大小缩放
指针算术不是简单地加减字节数,而是按其所指向类型的 sizeof 自动换算。比如 int* 加 1,实际地址偏移是 sizeof(int) 字节(通常是 4),不是 1 字节。
- 错误写法:
p + 1本意是跳过 1 个字节?不行——这会跳过整个int - 正确理解:
arr是int[5]数组首地址,&arr[0] + 3和arr + 3等价,都指向第 4 个元素 - 若需字节级偏移,先转
char*:例如static_cast<char>(p) + 5</char>才真偏移 5 字节
两个同类型指针相减得到元素个数,不是字节数
p1 - p2 的结果类型是 ptrdiff_t(有符号整型),值为两指针之间“能容纳多少个该类型元素”,和内存地址差除以 sizeof(T) 等价。
- 常见误用:对非同一数组(或未定义行为区域)的指针做减法,结果未定义——比如两个 malloc 出来的独立指针
- 安全场景仅限:同一数组内、或数组末尾后一位置(如
&arr[N])参与运算 - 示例:
int arr[10]; int* a = &arr[2]; int* b = &arr[7]; std::cout
指针++/-- 和 *p++ 这类复合操作的结合顺序容易出错
后缀递增 p++ 返回原值,再移动;而 *p++ 等价于 *(p++),即先取当前值,再让 p 指向下一元素——不是取下一个元素的值。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 典型陷阱:
while (*p++) { ... }会多走一步,循环结束时p已越界 - 若想遍历并停在最后一个有效元素后,用
while (*p) { ... ++p; }更清晰 - 前缀形式
++p和*++p(先移再取)也常被误读,建议拆成两行避免歧义
void* 不支持算术运算,必须先转具体类型
void* 是通用指针,但 C++ 标准禁止对它直接做 +、- 或 ++,因为编译器不知道“一个 void 单元”有多大。
立即学习“C++免费学习笔记(深入)”;
- 错误:
void* p = malloc(100); p++; // 编译失败 - 正确:
char* q = static_cast<char>(p); q += 10; // 显式转为 char* 后可字节偏移</char> - 如果原始数据是
double数组,应转double*再算术,否则q += 10是偏移 10 字节,而非 10 个double
指针算术本身不难,难在边界判断和类型一致性——越界访问不会报错,但可能读到垃圾值、触发未定义行为,或者在优化后彻底消失。调试时别只看地址值,务必确认它是否落在合法对象范围内。

















