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

    //二维数组传参问题示例  
    #include<iostream>  
    using namespace std;  
    //方法1:传递数组,注意第二维必须标明  
    void fun1(int arr[][3],int iRows)  
    {  
        for(int i=0;i<iRows;i++)  
        {  
            for(int j=0;j<3;j++)  
            {  
                cout<<arr[i][j]<<" ";  
            }  
            cout<<endl;  
        }  
        cout<<endl;  
    }  
    //方法二:一重指针  
    void fun2(int (*arr)[3],int iRows)  
    {  
          
        for(int i=0;i<iRows;i++)  
        {  
            for(int j=0;j<3;j++)  
            {  
                cout<<arr[i][j]<<" ";  
            }  
            cout<<endl;  
        }  
        cout<<endl;  
    }  
    //方法三:指针传递,不管是几维数组都把他看成是指针, 
    void fun3(int*arr,int iRows,int iCols)  
    {  
        for(int i=0;i<iRows;i++)  
        {  
            for(int j=0;j<3;j++)  
            {  
                cout<<*(arr+i*iRows+j)<<" ";  
            }  
            cout<<endl;  
        }  
        cout<<endl;  
    }  
    int main()  
    {  
        int a[2][3]={{1,2,3},{4,5,6}};  
        fun1(a,2);  
        cout<<endl;  
        fun2(a,2);  
        cout<<endl;  
        //此处必须进行强制类型转换,因为a是二维数组,而需要传入的是指针  
        //所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换  
        //为什么一维数组不用强制转换而二维数组必须转换,此问题还没解决,期待大牛!  
        fun3((int*)a,2,3);  
        cout<<endl;  
    }  
    

      

    用双重指针int**作为形参,接受二维数组实参吗?答案是肯定的,但是又局限性。用双重指针作为形参,那么相应的实参也要是一个双重指针。事实上,这个双重指针其实指向一个元素是指针的数组,双重指针的声明方式,很适合传递动态创建的二维数组。怎么动态创建一个二维数组?如下程序:

      

    1. int main()  
    2. {  
    3.     int m = 10;  
    4.     int n = 10;  
    5.     int** p = new int[m][n];  
    6. }  

    会发现编译不通过,第二个维度长度必须为常量。那么怎么声明一个两个维度都能动态指定的二维数组呢?看下面:

     
    1. void func5(int** pArray, int m, int n)  
    2. {  
    3.   
    4. }  
    5.   
    6. #include <ctime>  
    7. int main()  
    8. {  
    9.     int m = 10;  
    10.     int n = 10;  
    11.   
    12.     int** pArray = new int* [m];  
    13.     pArray[0] = new int[m * n]; // 分配连续内存  
    14.   
    15.     // 用pArray[1][0]无法寻址,还需指定下标寻址方式  
    16.     for(int i = 1; i < m; i++)  
    17.     {  
    18.         pArray[i] = pArray[i-1] + n;  
    19.     }  
    20.   
    21.     func5(pArray, m, n);  
    22. }  
       

    这里为二维数组申请了一段连续的内存,然后给每一个元素指定寻址方式(也可以为每一个元素分别申请内存,就不必指定寻址方式了),最后将双重指针作为实参传递给func5。这里func5多了两个形参,是二维数组的维度,也可以不声明这两个形参,但是为了安全嘛,还是指定的好。最后编译,运行,一切OK。总结一下,上面的代码其实是实现了参数传递动态创建的二维数组。

  • 相关阅读:
    Ubuntu环境变量设置注意点
    在使用Vue2.0中使用axios库时,遇到415错误
    Eureka+SpringBoot2.X结合Security注册中心安全验证
    Eureka+SpringBoot2.X版本实现优雅停服
    Linux 解压xz格式文件及安装xz
    Linux gzip: stdin: not in gzip format
    SpringBoot配置文件yml ScannerException: while scanning an alias *
    java 实现文件下载中文名不显示
    连接SpringBootAdmin 异常 Name or service not known
    Idea环境实现SpringBoot实现两种热部署方式(亲测有效)
  • 原文地址:https://www.cnblogs.com/dongzhuangdian/p/6618975.html
Copyright © 2011-2022 走看看