• 转: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;
    }
  • 相关阅读:
    5G网络类型 ?
    命令行签名
    软件著作权之源代码
    汗,查了很久的问题,竟然是重载错函数
    终于考完PMP
    ImportError: No module named _tkinter on macos
    numpy.trace对于三维以上array的解析
    ValueError: output parameter for reduction operation logical_and has too many dimensions ?
    numexpr low version warning
    Execution failed for task ':compileDebugAidl'.
  • 原文地址:https://www.cnblogs.com/youxin/p/2546874.html
Copyright © 2020-2023  润新知