为什么C语言定义多维数组只能省略第一维?

比如二维数组,如果省略列数,用行数和总长度来计算列数有何不可?

阅读 5.6k
3 个回答

严格得讲,C 并没有多维数组得概念。只是当数组得元素也时数组得时候,通常将其称作多维数组。

定义数组的时候,数组的长度可以省略,然后从初始化列表推断。但是所谓省略第二维,就不是推断数组的长度,而是去推断数组的元素的类型(数组的长度时类型的一部分)了。

二维数组相当于是指向数组的指针数组,即最后一维数组需要有确定的数组大小,所以不能省略。

至于多维数组类似,以后的每一维都是需要确定大小的数组,只有第一维可以单纯的认为是指针。

首先要理解一个问题,C语言的多维数组都是一维数组的语法糖。

int main()
{
    // 设定初值
    int d1[12];
    for (int i = 0; i < 12; i++)
        d1[i] = i + 1;

    // 一维数组
    for (int i = 0; i < 12; i++)
        printf("%d, ", d1[i]);
    printf("\n\n");

    // 二维数组
    int (*d2)[4] = (int(*)[4])d1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
            printf("%d, ", d2[i][j]);
        printf("\n");
    }
    printf("\n");

    // 三维数组
    int(*d3)[2][3] = (int(*)[2][3])d1;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            for (int k = 0; k < 3; k++)
                printf("%d, ", d3[i][j][k]);
            printf("\n");
        }
        printf("\n");
    }
}

同样的数据,你可以按一维、二维、三维的方式输出。

理解了这个问题,就知道为什么只允许省略第一维了,当 d2[i] 的 i+1 的时候,编译器会知道需要跳过 4 个 int。d3[i] 的 i+1 的时候,编译器会知道需要跳过 6 个 int,如果省略的是后面的,编译器就不知道该跳过几个了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题