增加一个D数组指针

时间:2017-08-19 12:39:15

标签: c pointers

#include<stdio.h>
#include<conio.h>

void main()
{
 int a[3][2]={{4,7},{6,5},{9,1}};

 int i,j;
 clrscr();

 for(i=0;i<2;i++)
  for(j=0;j<3;j++)
   {
     printf("%d ",*(a[j]+i));
   }
 getch();
}

此处a[i]的类型为int (*)[2]。所以,当我们*(a[0]+1)时,它应该转到下一行并打印6对吗?为什么打印7?

4 个答案:

答案 0 :(得分:1)

a[0]是一个包含值为{4,7}的2个整数的数组。它的类型为int[2]。当在大多数表达式中使用时,它会自动衰减到指向其第一个元素的指针,即指向int*的类型4。将此值递增1会使其指向下一个int,即7。

更清楚地写*(a[j]+i)的方式是a[j][i]。这也是一样的,因为p[x]被定义为*(p+x)

答案 1 :(得分:1)

a[j]的类型为int[2](不是int(*)[2]),而且是{4,7}{6,5}{9,1}之一。

a[0]是第一个元素{4,7}a[0]+1指向它的第二个元素,即7

答案 2 :(得分:1)

首先int a[3][2];不是 1D 数组。它是 2D 数组。你的标题不正确。

*(a[0]+1)未递增但*(a[0]+1)等效a[0][1]a[0][1]7

答案 3 :(得分:1)

为了清楚说明,让我们按照以下方式重写数组的定义

Save

内部循环内部看起来像

int a[3][2] = 
{
    { 4, 7 },
    { 6, 5 },
    { 9, 1}
};

对于索引for ( j = 0; j < 3; j++ ) { printf( "%d ", *( a[j] + i ) ); } 等于0,顺序使用这些表达式

i

表达式*( a[0] + 0 ) *( a[1] + 0 ) *( a[2] + 0 ) 给出第j行,并输出每行的第一个元素

a[j]

然后在外部循环中,变量4 6 9 j更改为0,我们有以下表达式

1

因此输出每行的第二个元素。结果我们有

*( a[0] + 1 )
*( a[1] + 1 )
*( a[2] + 1 )

考虑到帽子4 6 9 7 5 1 | |-> the second iteration of the outer loop 的类型为a[i],表达式(极少数例外)会转换为int[2]类型并指向数组的第一个元素。

表达式中使用的数组指示符int *被转换为a类型的指针。

所以这些表达

int ( * )[2]

可以用

形式重写
*( a[0] + 0 )
*( a[1] + 0 )
*( a[2] + 0 )