二维数组既可以通过二维访问也可以通过一维访问。
对于二维数组的传值,引进了数组指针。
#include <stdio.h>
void foo(int *p,int n)//一维访问
{
for(int i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
}
//因为二维数组的列数必须初始化
void func(int (*p)[4],int n)//引入数组指针来传递二维数组
{
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\t",p[i][j]);//*(*(p+i)+j)
}
putchar(10);
}
putchar(10);
}
int main()
{
int arr[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
//一维访问
int *p=(int*)arr;//既可以通过二重循环访问,也可以通过一重循环访问
foo(p,12);//通过一维传递
for(int i=0;i<12;i++)
printf("%d ",p[i]);
printf("\n");
//二维访问
func(arr,3);
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
printf("%d\t",arr[i][j]);//*(*(arr+i)+j)
putchar(10);
}
return 0;
}
二维可以转一维访问,那么一维同样可以转二维访问:
#include <stdio.h>
int main()
{
// int arr[10];
// int *p = arr;
// int **pp = &arr;//错误
int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=(int(*)[4])arr;
for(int i=0;i<sizeof(arr)/sizeof(int[4]);i++)
{
for(int j=0;j<4;j++)
{
printf("%d\t",p[i][j]);
}
putchar(10);
}
return 0;
}