在C中,如果2d数组的格式是arr [n] [0],那么这是一维数组吗? 如果列数是0,它如何存储在内存中?
答案 0 :(得分:1)
如果你的意思是像
那样的数组声明T arr[n][0];
其中T
是类型说明符,然后它是无效的。
符合C标准(6.7.6.2数组声明符)
1除了可选的类型限定符和关键字static之外,还有 [和]可以划定表达式或*。如果他们划定表达式 (指定数组的大小),表达式应具有 整数类型。如果表达式是常量表达式,它应该 值大于零 ....
答案 1 :(得分:1)
作为补充答案:
二维数组在内存中平面排列,它是一个线性的地址集合。
如果您想象这样的4X4阵列:
[0][0][0][0]
[1][1][1][1]
[2][2][2][2]
[3][3][3][3]
数组在内存中布局如下:
[0][0][0][0][1][1][1][1][2][2][2][2][3][3][3][3]
例如,当声明一个以二维数组作为参数的函数时,您总是需要为数组的第二部分提供大小。
您可以同时提供两者,或仅提供第二种:
int func(int array[4][4])
或int func(int array[0][4])
但是你不能同时省略或只提供第一个尺寸。
为什么呢?因为只需要某些大小来执行正确的指针运算:
例如,为了使用array[3][2]
,我们会向下移动3行,跨越2行,每行4 integers
宽= 4 * 3
整数插槽,然后再添加2
整数槽来到第3个元素。
array[3][2]
变成指针算术*(array + 3 * <width of array> + 2)
:
array[3][2] == *((int*)array + 3 * 4 + 2)
检查this答案,了解(int*)
的原因。
答案 2 :(得分:0)
偷偷地说我认为它存储在内存中的一维数组中。 2D不适合我们用于计算机。
关于arr [n] [0]的问题,列数不是0. arr [n] [0]只是意味着你试图访问第n行,第0列的元素。基本上是第一行中的任何元素。你仍然有一个二维数组而不是一维数组。