数组名的意义
1.数组名是地址常量(常量不能被赋值),代表数组的首地址=第一维的地址=首元素的地址
2.因此,
a.对一维数组a[m]: &a[i] <=> a+i a[i]<=>*(a+i)
特别地,当i=0时,&a[0]<=>a, a[0]<=>*a
b.对二维数组a[m][n]: &a[i][j] <=> a[i]+j <=>*(a+i)+j
a[i][j]<=>*(a[i]+j)<=>*(*(a+i)+j)
特别地,当i=j=0,&a[0][0]<=>a[0]<=>*a
a[0][0]<=>*(a[0])<=>**a
3.定义二维数组时,数组元素地址连续(参见下图),因而可以将二维地址转换为一维,即
&a[i][j] <=> a[i]+j <=>(a+i)+j<=>*(a+i*n+j)
a[i][j]<=>(a[i]+j)<=>((a+i)+j)<=>*(*(a+i*n+j))
n为数组第二维大小
但动态分配内存的二级指针不能这样,地址不连续
#include<stdio.h>
int main()
{
int a[3][3];
int i, j;
//输出地址
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
printf("%d ",&a[i][j]);
putchar(10);
}
printf("数组名a: %d\n",a);
printf("首元素地址&a[0][0]:%d\n",&a[0][0]);
printf("第一维地址&a[0]: %d\n",&a[0]);
//二维数组赋值
for(i=0; i<9; i++)
scanf("%d",&a[0][i]);//等价于*a+i
//输出二维数组
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
printf("%-3d",*(*(a+i)+j));//等价于a[i][j]
putchar(10);
}
printf("%d\n",**a);//第一个元素
return 0;
}