ptr++会真实修改指针值,易导致越界或指向错误;ptr+i仅临时计算,不改变原指针;混用二者易引发逻辑错乱,建议优先用*(arr+i)保持指针不变,必须移动时须严格边界检查。

用指针遍历数组时,为什么 ptr++ 比 ptr + i 更容易出错?
因为 ptr++ 会真实修改指针值,后续访问可能越界或指向错误位置;而 ptr + i 是临时计算,不改变原指针。尤其在循环中混用两者,极易导致逻辑错乱。
实操建议:
- 遍历时优先用
ptr + i形式(如*(arr + i)),保持原始指针不变 - 若必须移动指针(如解析连续内存块),确保有明确边界检查:
while (ptr - 避免对数组名直接做
++——arr++非法,因为arr是右值
访问二维数组时,int (*p)[cols] 和 int *p 的区别在哪?
前者是指向「整行」的指针,p + 1 跳过一整行(cols 个 int);后者是普通元素指针,p + 1 只跳一个 int。类型不匹配会导致地址偏移错误。
常见错误现象:用 int * 接收二维数组首地址,然后 *(p + i * cols + j) 看似能算对,但一旦涉及指针运算(如 p += 2),结果就完全不可控。
正确做法:
- 声明为
int (*p)[3] = &arr[0];(假设arr[2][3]),再用(*p)[j]或p[i][j] - 若坚持用
int *,必须全程用下标偏移:*(base + i * cols + j),且不能对base做自增
std::vector 能直接用指针访问吗?要注意什么?
可以,但仅限于非空时调用 &vec[0] 或 vec.data() 获取首元素地址;空 vector 的 data() 返回空指针,解引用必崩。
使用场景:需要传给 C 风格 API(如 memcpy、OpenGL 缓冲绑定)。
关键限制:
-
vector重分配(如push_back触发扩容)后,原有指针立即失效 - 不能用
vector对象地址当数组指针:&vec≠&vec[0] - 推荐优先用
vec.data()而非&vec[0],前者对空容器返回nullptr,更安全可判
为什么 char * 指针访问 char[] 有时能当字符串用,有时不行?
因为 C 风格字符串依赖末尾的 '\0' 终止符。若数组未显式初始化为全零、或复制时没留空间放 '\0',printf("%s", ptr) 会一直读到随机内存,引发崩溃或信息泄露。
典型坑:
-
char buf[5] = "hello";—— 实际写入 6 字节(含'\0'),越界 -
char buf[5]; strcpy(buf, "hi");——buf[2]是'\0',但buf[3]~buf[4]未初始化,strlen可能误判 - 用
std::string时别取c_str()后长期持有指针——内容变更后指针失效
最稳妥的方式:显式初始化 + 显式终止:char buf[10] = {0}; strncpy(buf, src, sizeof(buf)-1);
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











