千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 为什么不存在引用的数组?

为什么不存在引用的数组?

来源:千锋教育
发布人:xqq
时间: 2023-10-11 08:45:35 1696985135

一、为什么不存在引用的数组

因为数组是存放对象的地方,引用不是一个对象。指针和引用最大的区别就是指针是一个对象,引用不是对象。引用和指针不同。引用只是别名,没有确定的大小,必须引用一个确定存在的变量。

如果给了一个引用的数组,该如何分配空间呢?指针可以给一个NULL值或者nullptr,但是引用不行。

没有引用数组的原因

(1)引用数组指的是引用类型的数组,也就是数组的各个成员是引用&类型,这是在c++中不能实现的

(2)c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以

指向某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以

理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,

声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组

(3)C++不支持传统意义的复制:

传统的复制为:int a = b;

这里a和b在内存中分别占用不同的内存空间,但是内容一致。

如果int& a = b; 这个时候,内存中a并不被分配内存,所以没有复制可言。

所以对于数组元素是引用来说,没法完成元素的复制操作,没有给数组分配内存,所以数组中的元素不能是引用。

延伸阅读:

二、数组的引用的作用(存在)

(1)作为形参(防止数组退化为指针)

int func(int array[]);

int func(int array[10]);

int func(int* array);

在func中是无法知道数组的大小,如果开发者必须提前知道数组的大小,就需要用到数组的引用做参数

例如,int(&a)[2],可以有效的防止数组退化。也就是,数组作为函数参数传递过去后,仍然是一个数组。

优点:节省内存消耗,不用拷贝一份数组,直接使用原数组(甚至可以修改原数组)

#include

using namespace std;

int func(int(&a)[6])

{

    int count = 0;

    for (int i = 0; i < 6; i++)

    {

       count += a[i];

    }

    return count;

}

int main()

{

    int a1[6] = { 1,2,3,4,5,6 };

    int count = func(a1);

    cout << “count:” << count << endl;

    return 0;

}

代码安全性提高:

如果将 int a1[6] = { 1,2,3,4,5,6 }; 改为 int a1[5] = { 1,2,3,4,5 };

编译会报错说明编译时将进行数组长度的检查

(2)作为返回类型

函数不能直接返回数组,但是可以返回数组的指针和数组的引用,还需要注意,返回的不能是栈对象,

因为栈对象很快会被销毁

有关定义:

题目:编写一个函数的声明,使其返回包含10个string对象的数组的引用

//不用类型别名

string(&func(形参))[10];

//类型别名

using arr = string[10];

arr& func(形参);

typedef string(&arr)[10];

arr func(形参);

//尾置返回类型

auto func(形参)->string(&)[10];

//decltype关键字

string ss[10];

decltype(ss) &func(形参)

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT