【论指针(4)】指针与二维数组

 先来看一个二维数组:

  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));

}

}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值