C++数组指针疑问:int *arr_p = arr与&arr[0]赋值是否等价
问题解答
等价性结论
你提到的两种写法完全等价,赋值后arr_p的指向、类型、行为没有任何差异。
原理说明
C++存在「数组到指针的隐式退化规则」:除了作为sizeof、decltype、typeid运算符的操作数,或者作为取地址符&的操作数这几种特殊场景外,数组名在表达式中会自动转换为指向数组首元素的指针。
对应你的示例:
- 直接写
arr时,触发隐式退化,得到类型为int*、指向arr[0]的指针 - 写
&arr[0]时,是直接取第一个元素的地址,本身就是int*类型,值和退化后的arr完全一致
关于&arr的补充
你对&arr的理解完全正确:&arr的类型是int (*)[3],即指向包含3个int元素的整个数组的指针。它和arr、&arr[0]的内存地址值相同,但类型不同,指针运算的行为有明显区别:
- 对
int*类型的指针做+1运算,地址会偏移sizeof(int)字节,指向数组的下一个元素 - 对
int (*)[3]类型的指针做+1运算,地址会偏移sizeof(int[3])字节,直接跳过整个数组的存储范围
你可以用以下代码验证上述行为:
#include <iostream> int main() { int arr[] = {1, 2, 3}; int* p1 = arr; int* p2 = &arr[0]; int (*p3)[3] = &arr; std::cout << "p1地址:" << p1 << '\n'; std::cout << "p2地址:" << p2 << '\n'; std::cout << "&arr地址:" << reinterpret_cast<void*>(p3) << '\n'; std::cout << "p1 + 1地址:" << p1 + 1 << '\n'; std::cout << "&arr + 1地址:" << reinterpret_cast<void*>(p3 + 1) << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Raumschifffan
相关产品推荐
相关产品推荐

