C++笔记(13)数组的引用和引用的数组
数组的引用
数组有二个特性,影响作用在数组上的函数:一是不能复制数组,二是使用数组名时, 数组名会自动指向其第一个元素的指针。
因为不能复制,所以无法编写使用数组类型的形参,数组会自动转化为指针。比如:
void print(int arr[4]) { cout << sizeof(arr) << endl; }
调用函数时,始终输出8。
//上面的函数等同于 void print(int arr[]) {...} //也等同于 void print(int* arr) {...} //甚至等同于 void print(int arr[999]) {...}
而 x86 下 sizeof(int) ==4 , sizeof(int *)==4;x64 下 sizeof(int) ==4 , sizeof(int *)==8,因此输出为8.
要解决这样的问题,可以使用数组的引用。将数组形参声明为数组的引用,如果形参是数组的引用,编译器会传递数组的引用本身。
void print(int (& arr)[3]) { cout << sizeof(arr) << endl; }
此时输出为12。函数只能接受大小为3的int[]。用模板加数组的引用可以解决这个问题:
template<typename T, int N> void print(T(&arr)[N]) { cout << sizeof(arr) << endl; }
使用模板后可以使同一函数处理不同的数组了,扩大了函数的适用范围。但是这样定义的函数仍然存在这下述缺点:
1. 模板最终是要实例化的,所以调用多少个不同长度的数组,就要产生这个函数的多少份实例代码。而传统方式的函数只有一份实例,与函数的调用次数无关。
2. 不能应用于在编译期间数组的大小尚未确定的情况,这也使这个模板函数的适用范围受到限制。
3. 这样写的函数显然不能用指针变量作为函数的的参数,因此不能用这个函数处理动态分配的内存区域。
引用的数组
这是一个错误的定义
示例1:
示例2:
int arr[] = { 1, 4, 5}; int& a[3] = arr; //错误 int(&a)[3] = arr;//正确
这篇及以后的博客来自我的新电脑,嘿嘿!