C++ 引用的数组和数组的引用

C++ 引用的数组和数组的引用

  这两者的关系有点像指针数组和数组指针,其中指针数组可以简单地说就是数组中的元素为指针,而数组指针简单地说就是一个指向数组的指针

指针数组和数组指针学习参考链接https://blog.csdn.net/qq135595696/article/details/118738261

  而类比,引用的数组就是数组中的元素为引用类型,而数组的引用就是一个指向数组的引用

引用的数组和数组的引用学习参考链接https://blog.csdn.net/imxiangzi/article/details/49422465

引用的数组

int &array[];

array跟优先级高的[]结合,此时array[]为一个数组,紧接着跟int &结合,类比int arr[],可以看出本质是一个数组,其数组元素为引用类型。就好比int arr[],本质为一个一维数组,其中的数组元素为int类型。

  可以说引用的数组是很鸡肋的,应用场景很少。如果将引用的数组作为函数的参数,是非法的。因为首先引用必须要初始化,而数组并不能被另外一个数组初始化或另外一个数组赋值,并且其中数组中的元素不能同一时刻同时赋值。

数组的引用

int (&array)[];

array跟优先级高的&结合,此时&array为一个引用,紧接着跟[]结合,类比int (*arr)[],可以看出本质是一个引用,指向一个int类型的数组。就好比int (*arr)[],本质为一个指针,指向一个int类型的数组。

参考链接:https://blog.csdn.net/m0_52525841/article/details/122734831

  数组的引用具备一定的应用场景,比如在函数中,我们怎么获取一个数组的大小(不传递大小参数的情况下)?

  正常情况如下:

int a[20];

std::cout<<sizeof(a)/sizeof(a[0])<<std::endl;

  上述我们可以直接获取到一个数组的总大小,那么如果作为函数参数传递的话,情况如下:

void Print(int *a);
void Print(int a[]);

  但是上述情况,我们无法通过代码动态的获取数组的大小信息(编译器会进行优化,上述两者情况实际上都是int类型的指针),此时我们通常会多传递一个int size的参数来获取数组的大小信息。

  另外的解决方法,当然是使用引用。

  但是不能直接声明数组的引用:

void Print(int (&a)[]);

  因为这是一个不完整的数组类型,编译器无法得知具体的大小为多少。被迫地只能进行如下定义:

void Print(int (&a)[20]);

  但是上述方式会导致我们只能传递大小为20的int类型数组。如何进行动态传递呢?如下:

template<int N>
void Print(int (&a)[N]);

  利用模板的特性(编译器编译期间会自动推断出类型的大小,由于我们传递的是大小已知的数组,那么函数是可以推断出该长度的)可以达到动态获取数组的大小。实例如下:

template<int N>
void TestPrint(int(&a)[N]) {
    std::cout << N << std::endl;
}


int main() {
    int arrayNum[20] = { 3,4325,453 };
    TestPrint(arrayNum);
    system("pause");
    return 0;
}

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ufgnix0802

总结不易,谢谢大家的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值