#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?
答案 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 )