如何在不使用循环的情况下在C中初始化N维数组

我想初始化一个3 x 3矩阵,前两行为0,最后一行为1。 我已经声明了一个二维数组int matrix[3][3]

我想初始化它而不使用循环,如下所示

0 0 0
0 0 0
1 1 1

我还想要一个N dimiensional数组的解决方案

 int matrix[3][3] = { { 0, 0, 0 }, { 0, 0, 0 }, { 1, 1, 1 } }; 

或者,更紧凑:

 int matrix[3][3] = { [2] = { 1, 1, 1 } }; 

只要N是固定的,该解决方案就推广了N 如果N很大,你可以使用mouviciel对这个问题的答案。

 matrix[0][2] = matrix[0][1] = matrix[0][0] = matrix[1][2] = matrix[1][1] = matrix[1][0] = 0; matrix[2][2] = matrix[2][1] = matrix[2][0] = 1; 

要么

 #include  ... memset(matrix, 0, sizeof(matrix)); matrix[2][2] = matrix[2][1] = matrix[2][0] = 1; 

在你的情况下,你可以做到

 int a[3][3] = {{}, {}, {1,1,1}}; 

请注意,空花括号将自动填充0。

现在,如果你想

 0 0 0 0 0 0 1 0 0 

你可以这样做:

 int a[3][3] = {{}, {}, {1,}}; 

有关详细信息,请查看如何将arrays的所有成员初始化为相同的值? (这适用于一维数组,但它可以帮助您理解上面写的内容。)

此外, http://c-faq.com/~scs/cclass/notes/sx4aa.html是一个很好的数组初始化资源。

对于常量整数表达式N (比如宏或enum常量),您必须“展开”初始化程序。 当N扩展为十进制常量时,有一些宏观技巧可以做到这一点,但它们有点涉及。 P99提供了这样的宏,您可以编写

 #define N 23 int matrix[N][N] = { [N-1] = P99_DUPL(N, 1), }; 

这使您可以在需要时轻松更改N ,而无需在代码中触摸任何其他内容进行更新。