ptr[i]与*(ptr+i)等价,因为c语言中下标访问是语法糖,编译器将其统一翻译为指针偏移加解引用,二者汇编指令相同、性能无差异,但需确保ptr指向有效内存且i在合法范围内。

用指针遍历数组时,为什么 ptr[i] 和 *(ptr + i) 等价?
因为数组名在大多数上下文中会退化为指向首元素的指针,ptr[i] 本质就是语法糖,编译器直接翻译成 *(ptr + i)。两者生成的汇编指令完全一样,没有性能差异。
注意:ptr 必须指向有效内存,且 i 要在合法范围内(0 ),越界访问不会报错但行为未定义。
-
int arr[5] = {1,2,3,4,5}; int* ptr = arr;—— 正确,ptr指向arr[0] -
int* ptr = &arr[0];—— 效果相同,显式取址更清晰 - 不要写
int* ptr = arr[0];—— 这是把值(1)当地址用,编译可能通过但运行崩溃
如何用指针修改数组内容?
只要指针有写权限(非 const),解引用后就能赋值:*(ptr + i) = new_value;。这和 arr[i] = new_value; 完全等效。
常见错误是误用 & 或 sizeof 导致指针偏移错误:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
ptr + i移动的是i个元素单位(不是字节),sizeof(int)自动参与计算 - 别写
(char*)ptr + i除非你真想按字节移动——这会破坏类型安全 - 若函数参数是
int* p,传入&arr[0]即可,别传&arr(后者是int(*)[5]类型)
传递数组给函数时,指针参数怎么写才安全?
C++ 中无法真正“传数组”,只能传指针或引用。最常用且安全的方式是同时传指针和长度:
void process(int* arr, size_t len) {
for (size_t i = 0; i <p>调用时必须确保 <code>len</code> 准确:</p>
-
int data[] = {1,2,3}; process(data, std::size(data));—— 推荐用std::size(C++17) - 避免只传
int* arr不带长度——无法判断边界,极易越界 -
void func(int arr[10])这种声明实际仍是int* arr,[10]完全被忽略
用 std::vector 时还能用指针访问吗?
可以,但要注意:只有当 vector 非空且未发生重分配时,&vec[0] 返回的指针才有效。
-
int* ptr = vec.data();是标准写法,比&vec[0]更明确(且对空 vector 安全) - 调用
push_back、resize等操作后,原有指针立即失效 - 不要对
std::vector<bool></bool>取地址——它是特化实现,operator[]返回代理对象,&vec[0]不合法
原始数组和 std::vector 的指针访问逻辑一致,但生命周期管理责任完全不同——后者要自己盯住迭代器/指针失效点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










