数组指针输出二维数组

#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;
}

 

只要知道数组在什么时候是表示地址,是什么时候表示元素,这样就比较好运用指针来表示数组中的每个元素了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值