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;
}