这是来自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]);
}
Run Code Online (Sandbox Code Playgroud)
给出的选项是:
我运行此代码,但我没有得到任何此类代码.我得到了以下答案:
6 0
0 0
Run Code Online (Sandbox Code Playgroud)
你能帮我理解发生了什么吗?
主要问题是这一行:
int a[2][3]= { (1,2,3),(4,5,6)};
Run Code Online (Sandbox Code Playgroud)
它使用括号而不是大括号.(1,2,3)的结果只有3,(4,5,6)的结果只有6.所以这相当于:
int a[2][3]= { 3,6 };
Run Code Online (Sandbox Code Playgroud)
反过来相当于
int a[2][3] = { {3,6,0}, {0,0,0} };
Run Code Online (Sandbox Code Playgroud)
该行使ptr指向a [0]:
int (*ptr)[3] = &a[0];
Run Code Online (Sandbox Code Playgroud)
这条线
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
Run Code Online (Sandbox Code Playgroud)
等于
printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
Run Code Online (Sandbox Code Playgroud)
这可以简化为
printf("%d %d\n", (a[0])[1],(a[0])[2]);
Run Code Online (Sandbox Code Playgroud)
要不就
printf("%d %d\n", a[0][1],a[0][2]);
Run Code Online (Sandbox Code Playgroud)
这条线
ptr+=1;
Run Code Online (Sandbox Code Playgroud)
使ptr指向a的下一个元素,所以它相当于
ptr=&a[1];
Run Code Online (Sandbox Code Playgroud)
所以下一行简化为
printf("%d %d\n", a[1][1],a[1][2]);
Run Code Online (Sandbox Code Playgroud)
该程序有效地打印[0] [1],[0] [2],[1] [1]和[1] [2],这就是为什么你得到6,0,0,0.
Charles Baley指出main()缺少返回类型.这可能就是他们所得到的.编译器通常至少会对此发出警告.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |