C 二维数组指针

C 二维数组指针,c,pointers,C,Pointers,这是Microsoft测试中的一个问题: 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]); } 提供的选择包括: 分段故障 编译错误

这是Microsoft测试中的一个问题:

 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   

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

主要问题是这一行:

    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} };
    printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
    ptr=&a[1];
此行使ptr指向[0]:

    int (*ptr)[3] = &a[0];
这条线

    printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
    ptr+=1;
那么相当于

    int a[2][3] = { {3,6,0}, {0,0,0} };
    printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
    ptr=&a[1];
可以简化为

    printf("%d %d\n", (a[0])[1],(a[0])[2]);
或者只是

    printf("%d %d\n", a[0][1],a[0][2]);
这条线

    printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
    ptr+=1;
使ptr指向a的下一个元素,因此相当于

    int a[2][3] = { {3,6,0}, {0,0,0} };
    printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
    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,3是具有两个序列或逗号运算符的表达式;它的值是3。同样,4,5,6的值是6。这是在[0][1]处打印的6,因为ptr指向[0],您打印*ptr[1];0是一个[0][2],默认初始化为0。然后递增ptr,将其指向[1],这样就可以打印[1][1]和[1][2],默认初始化值为0。

main缺少返回类型。这应该会导致编译错误,除非您使用的是非常旧或非常自由的编译器。thanx:D我没有注意itA C89编译器,就像MS Visual C没有义务抱怨main.thanx:D上缺少返回类型一样,正如charles指出的,我遗漏了返回语句。但是,你能告诉我*ptr[3]=&a[0]具体在做什么吗?它int*ptr[3]=&a[0];将ptr定义为指向3个整数数组的指针,并使用指向a中第一个3个整数数组的指针对其进行初始化。因此,如果我有一个数组,假设{1,2,3,4},{5,6,7,8},并且我有*ptr[3]=&a[0],会怎么样?ptr和ptr+1指向的数组是什么?@VaibhavAgarwal:如果您没有更改数组的类型,那么额外的值将被忽略。如果将a的类型更改为int a[2][4],则ptr的类型将不兼容。