如下定义就得到一个数组的引用
类型名 (&变量明)[N];
实例
int int_array[10];
int (&int_ref)[10] = int_array;
这样就得到了一个数组的应用
在函数的声明中用数组的引用定义,就不怕数组退化了。如下
for_each( int (&int_ref)[10] ) { for( int i=0; i<10; ++i ) std::cout << int_ref[i] << std::endl; } int main( int argc, char* argv[] ) { int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } for_each( int_array ); return 0; }
在上面的代码中,如果你传入不是10个尺寸的数组,是编译通不过的。代码的安全性提高了。
想要定义一个数组引用类型,方法如下
typedef 类型明 (&数组引用类型明)[N];
实例
typedef int (&Array_Ref)[10];
Array_Ref就是一个数组的引用类型了。
我们可以这样typedef:
#include<stdio.h> #include<string.h> typedef char Char10[10]; void func(Char10 &a)//char (&a)[10]) { printf("%d\n",sizeof(a)); a[0]='x'; } int main() { char a[10]="abc"; func(a); for(int i=0;i<strlen(a);i++) printf("%c",a[i]); }
输出;
10
xbc请按任意键继续. . .
可以看到,把char[10]重定义为Char10,可以是我们很容易就理解。
区别这个:char &ary[],相当于(char &)ary[],ary是数组,数组元素是char &,不是数组的引用.
char (&ary)[],这样ary才是引用,引用对象是数组
引用数组,char[2] char[3]是两种不同的引用对象,故形参应指定数组的大小
void fun3(const char(&ary)[2] ) { } template <typename T> void fun1(const T &ary1, const T &ary2) { } template <typename T> void fun2(const T ary1, const T ary2) { } int main(int argc, char* argv[]) { fun1("1", "23"); //fun1实例化为const char[2], const char[3],T被推断成两个类型,故错误 fun1("1", "2"); //T推断成const char[2] fun2("1", "23"); //T推断成const char * fun3("1"); return 0; }