You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中int数组arr、&arr的区别及数组指针与数组引用的差异

&arr的含义

首先需要先纠正一个常见误区:数组名arr本身并不是指针,只是在绝大多数使用语境下会隐式退化为指向数组首元素的int*指针。
&arr的含义是取整个数组的地址,它的类型是int (*)[10],也就是指向包含10个int类型元素的数组的指针。
从数值上看,&arr和首元素地址arr是相等的,因为数组的起始地址就是第一个元素的地址,但二者的指针步长完全不同,可以看下面的示例:

int arr[10] = {0};
// 以下输出数值上相等,但类型完全不同
std::cout << arr << std::endl;    // 输出首元素地址,类型为int*
std::cout << &arr << std::endl;   // 输出整个数组的地址,类型为int(*)[10]

// 指针+1的步长差异
std::cout << arr + 1 << std::endl;   // 地址偏移4字节(1个int的长度)
std::cout << &arr + 1 << std::endl;  // 地址偏移40字节(10个int的总长度)
数组指针和数组引用的区别

二者的核心差异如下:

  • 本质属性不同
    数组指针本质是指针变量,存储的是数组的地址,本身占用指针大小的内存空间,可以修改指向其他同类型数组;数组引用本质是原数组的别名,和原数组占用同一块内存,不需要额外存储空间,一旦绑定就不能再指向其他数组。
    二者的定义语法也有明显区别:
    int arr[10] = {0};
    int (*p_arr)[10] = &arr; // 数组指针定义
    int (&r_arr)[10] = arr;  // 数组引用定义
    
  • 使用方式不同
    数组指针访问元素需要先解引用:(*p_arr)[0] = 1;数组引用的使用方式和原数组完全一致:r_arr[0] = 1。
  • 安全性不同
    数组指针可以赋值为nullptr,也可能指向非法地址,使用前需要做合法性校验;数组引用必须绑定到已经存在的合法数组,不存在空引用的情况,使用安全性更高。
  • 参数传递特性不同
    二者作为函数参数时,都会保留数组的长度信息,不会出现普通数组传参退化为指针丢失长度的问题;区别在于传数组指针时调用方需要显式传入数组的取地址结果,而数组引用的调用写法和普通数组传参一致。

内容的提问来源于stack exchange,提问作者Ajx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:30:02