zoukankan      html  css  js  c++  java
  • 数组作为函数参数传递

    数组作为函数参数传递的时候,会退化为指针,并不能得到数组的大小

    void test1(int a[])
    {
        cout << sizeof(a) << endl;
    }
    
    int main() {
        int a[4];
        test1(a);
    }
    

    输出结果是指针的大小,并不是数组的大小

    void test2(int a[4])
    {
        cout << sizeof(a) << endl;
    }
    int main() {
        int a[4];
        test2(a);
    }
    

    这种情况,也是指针,虽然声明了是数组,但是由于值传递,还是先把a转成了指针,又传递的。

    void test4(int(&a)[4])
    {
        cout << sizeof(a) << endl;
    }
    int main() {
        int a[4];
        test4(a);
    }
    

    这种是可以的,但是限定了数组的大小,没有意义,如果把函数参数中数组大小4去掉,编译不过。

    模板

    template<size_t size>
    void test5(int (&a)[size])
    {
        cout << sizeof(a) << endl;
    }
    template<class T, size_t size>
    void test6(T (&a)[size])
    {
        cout << sizeof(a) << endl;
    }
    

    模板是可以获得大小的,并且是作为数组传递,要注意的是必须是数组的引用,如果直接是void test(T a[size]),模板是没有问题,但是传递数组的时候,模板无法展开,类型对应不上。

    注意

    为什么数组的引用是int (&a)[size],而不是int & a[size]呢?因为根据优先级组合规则,后面的会被认为是(int&)a[size]引用的数组,这个是非法的,所以需要括号明确a的类型为引用

    版权声明:本文版权归作者所有,如需转载,请标明出处

  • 相关阅读:
    概率的定义
    二项式分布与伯努利分布
    复数的表示方法
    <诗经>的由来
    王国维
    应该记住的历史事件
    switch条件变量的取值类型
    & 和 && 区别和联系,| 和 || 区别和联系
    成功安装 Visio 2016 和 Office 2016 的64位版本~~
    删除MicrosoftOffice2016的扫尾工作
  • 原文地址:https://www.cnblogs.com/studywithallofyou/p/14549955.html
Copyright © 2011-2022 走看看