C|二维数组做函数参数的5种方式

我们知道,数据在内存中是一维线性顺序存储的,如何表示二维数组呢?在编程语言中,二维数组如果按照行主序进行存储,则用行i、列j的行列式来表示每一个元素,如有数组arr[i][j](数组名arr即表示一块内存区域的首地址,其元素偏移可用i、j的表达式来表示),其每一个元素可用指针表示:arr+i*icols+j (i、j的初始值为0),解引用后就是a[i][j]。当然,可以当做一个降维的数组来处理,其元素为一个数组指针:arr[i]。

有5种方式可以在函数参数中调用一个二维数组:

#include <stdio.h>
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

// 1 传二维数组,第二维必须标明
//   函数调用:arr2D_1(arr,3);
void arr2D_1(int arr[][4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            printf("%5d",arr[i][j]);
        }
    }
	printf("\n");
}

// 2 传数组指针,第二维必须标明
//   函数调用:arr2D_2(arr,3);
void arr2D_2(int (*parr)[4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            printf("%5d",parr[i][j]);
        }
    }
	printf("\n");
}

// 3 降维处理,传指针指向降一维的数组元素
//   函数调用:arr2D_3(arr[0],3,4);或arr2D_3((int*)arr,3,4);
void arr2D_3(int *arr,const int irows,const int icols)
{
    for(int i=0;i<irows;++i)
    {
        for(int j=0;j<icols;++j)
        {
            printf("%5d",*(arr+i*icols+j));
        }
    }
	printf("\n");
}

// 4 使用二维指针传值
//   函数调用:arr2D_4((int**)arr,3,4);否则int[3][4]与int **类型不匹配
void arr2D_4(int **arr, int rows, int cols)
{
    for (int i=0;i<rows;++i)
    {
        for(int j=0;j<cols;++j)
        {
            printf("%5d",*((int*)arr + cols*i + j)); 
        }
    }
	printf("\n");
}
// 5 使用指针数组
//   函数调用,实参也使用指针数组,但指针数组的元素需循环预先赋值
void arr2D_5(int* arr[], int rows, int cols)
{
	for(int i=0;i<rows; i++)
		for(int j=0;j<cols; j++)
			printf("%5d",arr[i][j]);
}

int main()
{
	int* q,(*p)[4];
	for(p=arr;p<arr+3;p+=1)
		for(q=p[0];q<p[0]+4;q+=1)
			printf("%5d",*q);
	printf("\n");

	p=arr;
	for(int i=0;i<3;i++)
		for(int j=0;j<4;j++)
			printf("%5d",p[i][j]);
	printf("\n");

	arr2D_1(arr,3);
	arr2D_2(arr,3);
	arr2D_3(arr[0],3,4);
	arr2D_3((int*)arr,3,4);
	arr2D_4((int**)arr,3,4);

	int* parr[3];
	for(int k=0;k<3; k++)
		parr[k]=arr[k];
	arr2D_5(parr,3,4);

    getchar();
	return 0;
}
/*output:
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
    1    2    3    4    5    6    7    8    9   10   11   12
*/

-End-

举报
评论 0