转:C++ 数组引用

  如下定义就得到一个数组的引用
        类型名 (&变量明)[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;
}
原文地址:https://www.cnblogs.com/youxin/p/2546874.html