二维数组作为形参--传值的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
推荐阅读