#include<stdio.h>
int main()
{
int a[2][3]={{1,3,5},{7,4,2}};
int *p=a[0];
int (*q)[3]; //定义一个有三个元素的行指针q与a在等级上是相同的,所以可以用q=a进行赋值 ,a,a+1,a+2...等都是也行指针。
在这里有必要了解a[0]等价于&a[0][0],即a[i]就是第 i 行的首地址,*a[0]是一个元素的值也就是*a[0]=a[0][0],对于a进行*运算实际就是得到一个行指针
如*(a+i)=a[i];
q=a;
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(p+i*3+j));//这里的指针p应该比较好理解
}
printf("\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(a[i]+j));//把这里的a[i]理解成是每一行的首地址就好理解了,+j 就是对应着每一行的第j个元素
}
printf("\n");
for(i=0;i<2;i++)
{
q=a+i;
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(*(q)+j));//在这里我们如果把*(p)中的*把*的作用理解成指针降级,就是把行指针降级为行的首地址,相当于下面的q[0]
printf("a[%d][%d]=%d\t",i,j,*(q[0]+j));//
}
printf("\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(*(a+i)+j));//这里也理解为降级的作用,本来我们a+i是行地址,降级后就是行的首地址了,这样就可以把一行的所以元素多输出来。
}
printf("\n");
q=a;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(*(q+i)+j));//a与在和数组指针q有着相同的用法
}
printf("\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("a[%d][%d]=%d\t",i,j,*(&a[0][0]+i*3+j));//这个就比较好理解了,就是从a的首地址一个一个的输出,在我们用指针和一维数组时,指针int *p和一维数组int a[ ] 是相同的 如a[3]=p[3]这是相等的。
}
printf("\n");
return 0;
}
只要知道数组在什么时候是表示地址,是什么时候表示元素,这样就比较好运用指针来表示数组中的每个元素了。