欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二维数组作为形参--传值的3三种方式

程序员文章站 2022-03-08 20:37:34
...

二维数组作为形参传值的3种方式

在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的名字代表二维数组第0行的首地址(注意它是代表一行元素的首地址,而不是第0行第0列元素的首地址,虽然是相等的,但不能这么理解,所以在没有强制转换的情况下,二维数据要么通过行指针进行参数传递,要么通过二维指针进行参数传递

/*传二维数组*/

//第1种方式:传数组,第二维必须标明
/*void display(int arr[][4])*/
void display1(int arr[][4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<arr[i][j]<<" ";     //可以采用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}

//第2种方式:一重指针,传数组指针,第二维必须标明
/*void display(int (*parr)[4])*/
void display2(int (*parr)[4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<parr[i][j]<<" ";    //可以采用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}
//注意:parr[i]等价于*(parr+i),一维数组和二维数组都适用

//第3.1种方式:
void display3(int *arr,const int irows,const int icols)
{
    for(int i=0;i<irows;++i)
    {
        for(int j=0;j<icols;++j)
        {
            cout<<*(arr+i*icols+j)<<" ";   //注意:(arr+i*icols+j),不是(arr+i*irows+j)
        }
        cout<<endl;
    }
    cout<<endl;
}
//调用方式:display3((int*)arr,irows,icols); 即将二维数组强转成一维使用(形参部分强转)

//第3.2种方式:使用二维指针传值
void display3(int **arr, int rows, int cols)
{
    for (int i=0;i<rows;++i)
    {
        for(int j=0;j<cols;++j)
        {
            cout<< *((int*)arr + cols*i + j) <<endl; 
        }
        cout<<endl;
    }    
}
//同样需要进行强制转换使用(函数内部强转)

转自:https://www.cnblogs.com/cygalaxy/p/6963789.html
转自:http://www.cnblogs.com/bewolf/p/4321642.html


相关标签: C++学习笔记