比如二维数组,如果省略列数,用行数和总长度来计算列数有何不可?
二维数组相当于是指向数组的指针数组,即最后一维数组需要有确定的数组大小,所以不能省略。
至于多维数组类似,以后的每一维都是需要确定大小的数组,只有第一维可以单纯的认为是指针。
首先要理解一个问题,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,如果省略的是后面的,编译器就不知道该跳过几个了。
3 回答1.1k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
4 回答796 阅读
1 回答873 阅读
1 回答902 阅读
1 回答672 阅读
1 回答779 阅读
严格得讲,C 并没有多维数组得概念。只是当数组得元素也时数组得时候,通常将其称作多维数组。
定义数组的时候,数组的长度可以省略,然后从初始化列表推断。但是所谓省略第二维,就不是推断数组的长度,而是去推断数组的元素的类型(数组的长度时类型的一部分)了。