用于2D阵列的指针

时间:2012-09-25 05:20:40

标签: 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]);

    }

给出的选项是:

  1. 分段错误
  2. 编译错误
  3. 总线错误
  4. 运行时错误
  5. 我运行此代码,但我没有得到任何此类代码。我得到了以下答案:

    6 0   
    0 0   
    

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

2 个答案:

答案 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。