定义一个数组:int a[3][5];
//给数组赋值
int i=0,j=0, tmp=1;
for (i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=tmp++;
}
}
//打印数组:
int i=0,j=0;
for (i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ", a[i][j]);
}
}
//多维数组名代表了什么?打印多维数组名地址:
printf("a: %d, a+1: %d \n", a, a+1); //a+1往后跳了5个int型字节大小(20个字节)因此a指向一维数组,即a和一个指向一维数组的指针等价
printf("&a: %d, &a+1: %d \n", &a, &a+1);
// //a+1往后跳了20个字节,步长是5个元素。因此a指向一维数组,即a和一个指向一维数组的指针等价。&a+1步长为60个字节。
多维数组名的本质是一个数组指针。
int (*parray)[5]; //定义一个指向数组的指针
parray=a; // a是指向一维数组的二级指针,p是二级指针,可以将a赋值给parray。
//a+i,parray+i代表整个第i行数组地址,加一个星号*代表第i行首元素地址*(a+i),加j后,代表第i行的第j个元素的地址。
//中括号到括号的技术推演:中括号的运算顺序:从左至右。i加占位符0;0换成a,中括号变括号,同时括号前加星号
//a[i][j] ==> a[0+i][j] ==> *(a+i)[j] ==> *(a+i)[0+j] ==> *(*(a+i)+j)
//多维数组做函数参数,存在退化问题
//以下三种函数形参写法等价:
void printArray(int a[3][5])
void printArray(int a[][5])//a的本质是指向一维数组的指针,故第一维可以省略
void printArray(int (*a)[5]) //定义一个数组指针类型a
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ", a[i][j]);
}
}
}
可以证明,多维数组是线性存储的。证明思路:可以把二维数组当一维数组打印。若要证明,可以把数组按照一维数组打印的方法打印多维数组的值,一维数组的长度即多维数组长度的总的元素之后