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
相关产品推荐
相关产品推荐

