zoukankan      html  css  js  c++  java
  • C++中将二维数组(静态的和动态的)作为函数的参数传递

    在C++编程中,我们经常将数组作为参数传递到另一个函数,数组的维数不同,传递方式也不同,此处将作一个总结,包括一维静态、动态数组,二维静态、动态数组。

    一,一维数组(静态、动态一维数组)

    1, 一维数组寻址形式:num[i]的地址:num+i,因此一维数组作为参数传递时候,只需要用数组名作为参数即可。

    shuchu(num)
    void shuchu(int num[])

    2,一维数组实例:

    #include <iostream>
    using namespace std;
    
    void ces1(int *num)
    {
        for (int i = 0; i < 5; i++){
            cout << num[i] << endl;
        }
    }
    
    
    void ces2(int *num, int m)
    {
        for (int i = 0; i < m; i++){
            cout << num[i] << endl;
        }
    }
    
    
    int main()
    {
        int num1[5];
        for (int i = 0; i < 5; i++){
            num1[i] = i;
        }
        ces1(num1);
    
    
        int k = 5;
        int *num2 = new int[k];
        for (int i = 0; i < k; i++){
            num2[i] = i + 1;
        }
        ces2(num2, k);
        delete[] num2;
    
    
        return 0;
    }
    View Code

    二,二维数组

     1,静态二维数组利用数组名和第二维大小作为参数

    (1)二维数组如下int num[M][N],二维数组寻址形式:num[i][j]的地址:num+i*N+j。由此可知二维数组作为参数传递时候,除了数组名作为参数,还需要数组第二维的大小,第一维随意。

    二维数组实参:

    shuchu(num);

    二维数组形参二种形式皆可:

    void shuchu(num[3][4]);
    void shuchu(num[][4]);

    (2)二维数组实例:

    #include <iostream>
    using namespace std;
    
    void ces(int num[5][5])      //这样可以
    //void ces(int num[][5])     //这样可以
    //void ces(int num[5][])     //这样不可以
    {
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                cout<<num[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    
    int main()
    {
        int num[5][5];
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                num[i][j] = i * j;
            }
        }
        ces(num);
        return 0;
    }
    View Code

    2,动态二维数组利用二维指针传递数组参数

    (1),我们知道动态二维数组的第一维和第二维都是变量,因此我们利用"数组名和二维大小作为形参"这种方式失效,此处必须利用二维指针。

    二维数组实参:

    shuchu(num);

    二维指针作为形参:

    void shuchu(int **num)

    二维数组在子函数中使用方式:

    num[i][j]即可

    3,静态二维数组也可用二维指针。

    二维数组实参:

    shuchu((int **)num);     //此处需要强制转化

    二维指针作为形参:

    void shuchu(int **num)

    二维数组在子函数中使用方式:

    这样是不对的:  num[i][j]
    必须这样:     *((int *)num+5*i+j) 或 
                 ((int *)num+5*i)[j]

    4,下面给出了二维静态数组和动态数组的两个实例,有两处不同,在程序中用红色标识了

    //二维静态数组
    #include <iostream>
    using namespace std;
    
    void ces(int **num)
    {
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                cout<<*((int *)num+5*i+j)<<" ";           //这样可以
    //            cout<<((int *)num+5*i)[j]<<" ";         //这样可以
    //            cout<<num[i][j]<<" ";                   //这样不可以
            }
            cout<<endl;
        }
    }
    
    int main()
    {
        int num[5][5];
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                num[i][j] = i * j;
            }
        }
        ces((int **)num);                 //这样可以
    //    ces(num);                       //这样不可以
        return 0;
    }
    View Code
    //二维动态数组
    #include <iostream>
    using namespace std;
    
    void ces(int **num, int m, int n)
    {
        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){
    //            cout<<*((int *)num+5*i+j)<<" ";              //这样不行
    //            cout<<((int *)num+5*i)[j]<<" ";              //这样不行 
                cout<<num[i][j]<<" ";                          //这样可以
            }
            cout<<endl;
        }
    }
    
    int main()
    {
        int m = 5, n = 5, i, j;
        int **num = new int*[m];
        for (i = 0; i < m; i++)
        {
            num[i] = new int[n];
        }
        for (i = 0; i < m; i++){
            for (j = 0; j < n; j++){
                num[i][j] = i * j;
            }
        }
        ces(num, m, n);                            //这样可以
    
    //    ces((int **)num, m, n);                  //这样可以
        for (i = 0; i < m; i++)
        {
            delete[] num[i];
        }
        delete[] num;
        return 0;
    }
    View Code
  • 相关阅读:
    OpenGL播放yuv视频
    windows 播放器(wzplayer)
    Lotus中的保留域
    Domino Attachment and Object Service (DAOS)
    关于MyEclipse
    DB2站点荟萃
    @IsMember用法
    深入浅出SharePoint——解读Sharepoint日志之输出缓存
    UML用例图概要
    表单设计中的网页视觉体验
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/3286186.html
Copyright © 2011-2022 走看看