如何理解C多维数组的语法?
我的直觉当我看到这int array_name[x][y];
是阵列y
的阵列,即array_name[x]
是一个元件的出y
这样的元件。但事实并非如此[事实上它是相反的(?)]
指南/教程似乎一心要带矩阵来解释这一点,这使得它特定于 2D 数组。我希望了解一般array_name[w][x] ... [n]
语法。
注意:很好,语法就是语法,这就是 C 定义它的方式,好吧。那么,是否array_name[w][x] ... [n]
只是一个w
元素数组,每个元素都是array_name[x] ... [n]
?但即使这样也不完全正确,因为int a[][3] = {1,2,3,4,5,6,7};
即使 RHS 包含许多不能被 3 整除的元素也是有效的。
回答
int x[5][3];
声明x
为具有 5 个元素的数组。这些元素中的每一个都是一个包含 3 的数组int
。到目前为止你是对的。
但是你应该用-Wall -Wextra
. 看这里:
k.c:2:16: warning: missing braces around initializer [-Wmissing-braces]
2 | int a[][3] = {1,2,3,4,5,6,7};
| ^
| { }{ }{}
以这种方式初始化它是有效的,但更合适的初始化方式是:
int a[][3] = {{1,2,3},{4,5,6},{7,0,0}};
这更具可读性。不需要零。如果您初始化一个元素,则所有其他元素都将归零。
另一件事是,您可以越界,而实际上不会越界多维数组。请注意,即使这可能奏效,也是未定义的行为,所以不要这样做!
a[1][4] = (*a+1)[4]=*(*a+1)+4)
这是因为[]
它只是指针运算的语法糖。因此,如果您T x[5][3];
为某种类型声明了T
,x[1][1]
则将指向与x[0][4]
但正如我所说,它是 UB。在此处阅读更多相关信息