&a[0][0]即可以看做数组0行0列的首地址,也可以看做二维数组的首地址
#include<stdio.h>
void main()
{
int a[3][5],i,j;
for(i=0;i<3;i++) //控制二维数组的行数
for(j=0;j<5;j++) //控制二维数组的列数
scanf("%d",a[i]+j); //给二维数组赋值
printf("输出的二维数组是:\n");
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
printf("%-3d",*(a[i]+j));
printf("\n");
}
}
可改成
#include<stdio.h>
void main()
{
int a[3][5],i,j,*p;
p=a[0];
for(i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d",a[i]+j);
p=a[0]; //p为第一个元素的地址
printf("输出的二维数组是:\n");
for(i=0;i<3;i++)
{
for(j=0;j<;j++)
printf("%-3d",*p++); //从第一个元素地址往上加,然后输出元素
printf("\n");
}
}
&a[0]是第0行的首地址,a[n]是第n行的首地址。
输出指定行数
#include<stdio.h>
void main()
{
int a[3][5],i,j,(*p)[5];
p=&a[0];
for(i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d",(*(p+i))+j); //*(a[i]+j)
p=&a[2]; //p为第一个元素的地址
printf("数组第三行是:\n");
for(j=0;j<5;j++)
printf("%-3d",*((*p)+j));
printf("\n");
}
可改成
#include<stdio.h>
void main()
{
int a[3][5],i,j;
for(i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d",*(a+i)+j);
printf("数组的第三行是\n");
for(j=0;j<5;j++)
printf("%-3d",*(*(a+2)+j));
printf("\n");
}
a+n表示第n行的首地址
*(*(a+n)+m)表示第n行第m列元素。
*(a[n]+m)表示第n行第m列元素
利用指针引用二维数组中*(a+i)与a[i]是等价的。