如何理解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];为某种类型声明了Tx[1][1]则将指向与x[0][4]

但正如我所说,它是 UB。在此处阅读更多相关信息


以上是如何理解C多维数组的语法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>