先来看一个二维数组:
int a[2][2];
结构如下:
a[0][0] a[0][1]
a[1][0] a[1][1]
我们可以分为2个一维数组,
a={a[0],a[1]};
a[0]={a[0][0],a[0][1]};
a[1]={a[1][0],a[1][0]};
这样我们发现a,a[0],a[1]都是一维数组的数组名,由一维数组我们知道数组名代表首地址,所以a,a[0],a[1]都代表各种数组的首地址!
通过上面的联系,在根据在内存的连续性,我们就能得出所有元素的地址!
首先根据a数组,我们得到
&a[0] =a;
&a[1]=&a[0]+1=a+1;
再根据数组a[0]和a[1],可以得到
&a[0][0]=a[0]=*(&a[0])=*a
&a[0][1]=&a[0][0]+1 =*a+1
&a[1][0]=a[1]=*(&a[1])=*(a+1)
&a[1][1]=&a[1][0]+1=*(a+1)+1
所以
a[0][0]=**a;
a[0][1]=*(*a+1)
a[1][0]=*(*(a+1))
a[1][1]=*(*(a+1)+1)
上面是用二维数组名a来表示所有的数据,可能再某些情况下不方便,所以我们要利用指针和合适的变量来表示数据!
我们来看下面一段程序:
int a[3][4]={};
int *p;
p=a[0];
则p意味着数据a[0][0]的地址,因为数据存储的连续性,我们只要知道二维数组的长度就可以表示任何数据的地址了!
下面就是一个实例:
用指针变量输出二维数组的所有元素?
void main(void)
{
int a[2][2]={{1,2},{3,4}};
int *p;
for(p=a[0];p<a[0]+4;p++)
{
printf("%d",*p);
}
}
当然如果要想用a实现也是可以,为了简化,往往我们会定义一个双重指针,程序如下:
void main(void)
{
int a[2][2]={{1,2},{3,4}};
int (*p)[2],i,j;
p=a;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d",*((*p+i)+j));
}
}
}