我们知道,数据以一维线性顺序存储在内存中。如何表示二维数组?在编程语言中,如果二维数组是按照行主顺序存储的,那么行I和列J的行列式就代表了每个元素。如果有arr[i][j](数组名arr是一个内存区域的第一个地址,它的元素偏移量可以用I和J的表达式来表示),那么每个元素都可以用一个指针来表示:arr I * icols J(I I和J的初始值为0)。当然,它可以被视为降维数组,它的元素是数组指针:arr[i]。
有五种方法可以调用函数参数中的二维数组:
#包含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;iirows(一)
{
for(int j=0;j4;j)
{
printf(']',arr[I][j]);
}
}
printf(' n ');
}
//2传递数组指针,必须标记第二维。
//函数调用:arr2D_2(arr,3);
void arr2D_2(int (*parr)[4],const int irows)
{
for(int I=0;iirows(一)
{
for(int j=0;j4;j)
{
printf(']',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;iirows(一)
{
for(int j=0;jicolsj)
{
printf(']',*(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;irows(一)
{
for(int j=0;jcolsj)
{
printf(']',*((int *)arr cols * I j));
}
}
printf(' n ');
}
//5使用指针数组
//函数调用,实际的参数也使用指针数组,但是指针数组的元素需要在一个循环中提前赋值。
void arr2D_5(int* arr[],int rows,int cols)
{
for(int I=0;irows(一)
for(int j=0;jcolsj)
printf(']',arr[I][j]);
}
int main()
{
int* q,(* p)[4];
for(p=arr;parr 3;p=1)
for(q=p[0];qp[0]4;q=1)
printf(']',* q);
printf(' n ');
p=arr
for(int I=0;i3;(一)
for(int j=0;j4;j)
printf(']',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;k3;k)
parr[k]=arr[k];
arr2D_5(parr,3,4);
getchar();
返回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
*/-结束-