You need to enable JavaScript to run this app. C++数组指针疑问:int *arr_p = arr与&arr[0]赋值是否等价
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 09:15:02