用于2D阵列的指针

Vai*_*wal -1 c pointers

这是来自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)

给出的选项是:

  1. 分段故障
  2. 编译器错误
  3. 总线错误
  4. 运行时错误

我运行此代码,但我没有得到任何此类代码.我得到了以下答案:

6 0   
0 0   
Run Code Online (Sandbox Code Playgroud)

你能帮我理解发生了什么吗?

Vau*_*ato 8

主要问题是这一行:

    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()缺少返回类型.这可能就是他们所得到的.编译器通常至少会对此发出警告.