这是来自Microsoft Test的问题:
main()
{
int a[2][3]= { (1,2,3),(4,5,6)};
int (*ptr)[3] = &a[0];
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
ptr+=1;
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
}
给出的选项是:
我运行此代码,但我没有得到任何此类代码。我得到了以下答案:
6 0
0 0
你能帮我理解发生了什么吗?
答案 0 :(得分:8)
主要问题是这一行:
int a[2][3]= { (1,2,3),(4,5,6)};
它使用括号而不是大括号。 (1,2,3)的结果只有3,(4,5,6)的结果只有6.所以这相当于:
int a[2][3]= { 3,6 };
反过来相当于
int a[2][3] = { {3,6,0}, {0,0,0} };
此行使ptr指向[0]:
int (*ptr)[3] = &a[0];
这一行
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
等同于
printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
可以简化为
printf("%d %d\n", (a[0])[1],(a[0])[2]);
或只是
printf("%d %d\n", a[0][1],a[0][2]);
这一行
ptr+=1;
使ptr指向a的下一个元素,因此它等同于
ptr=&a[1];
所以下一行简化为
printf("%d %d\n", a[1][1],a[1][2]);
该程序有效地打印[0] [1],[0] [2],[1] [1]和[1] [2],这就是为什么你得到6,0,0, 0
Charles Baley指出main()缺少返回类型。这可能就是他们所得到的。编译器通常至少会对此发出警告。
答案 1 :(得分:2)
您确定是否正确复制了文本?
(1,2,3)
是一个带有两个序列或逗号(,
)运算符的表达式;它的值为3.同样,(4,5,6)
的值为6.这是在a[0][1]
打印的6(因为ptr指向a[0]
并且您打印(*ptr)[1]
); 0为a[0][2]
,默认初始化为0.然后,您将ptr
增加,指向a[1]
,以便打印a[1][1]
和a[1][2]
,默认初始化为0。