列与行的2D数组初始化

时间:2016-02-01 18:15:44

标签: c arrays column-major-order row-major-order

如果我有一个包含3行和5列的数组:

int arr[3][5]={0};

现在我想输入一些数字,所以我喜欢这样:

int arr[3][5] ={10,8,9}

现在数组设置如下:

 10  8  9  0  0
  0  0  0  0  0
  0  0  0  0  0

但我想要的是,实际上数组中的第一个列元素设置如下:

10  0  0  0  0
8   0  0  0  0
9   0  0  0  0

我如何交换或更改数组顺序是这样的?

4 个答案:

答案 0 :(得分:8)

你想要这个:

int arr[3][5] ={{10},{8},{9}};

这会初始化三个第一维数组中的每一个,并且每个数组都只显式初始化第一个元素,导致其余部分设置为0.

分解上面的初始化,arr是一个大小为3的数组,其中每个元素都是大小为5的int数组。因此{10}初始化这3个数组中的第一个元素,{8}初始化第二个,{9}初始化第三个。并且因为每个只初始化每个子数组的5个元素中的第一个,所以其余部分初始化为0.

来自C standard的第6.7.9节:

  

19 初始化应在初始化列表顺序中进行,每个都是   初始化程序为特定的子对象提供覆盖任何子对象   以前列出的同一子对象的初始值设定项; 所有子对象   未明确初始化的应隐式初始化   与具有静态存储持续时间的对象相同。

答案 1 :(得分:2)

为什么不写

int arr[3][5] = { {10, 0, 0, 0, 0},
                  {8, 0, 0, 0, 0},
                  {9, 0, 0, 0, 0 }};

即。初始化数组中的每个元素

答案 2 :(得分:2)

使用指定的初始化程序:

int test[3][5] = { [0][0] = 10 , [1][0] = 8 , [2][0] = 9 } ;

答案 3 :(得分:0)

  

我如何交换或更改数组顺序是这样的?

在C中,完全没有。这不是C的语言特征。

您必须使用for循环或类似的东西来遍历行而不是列,或者使用单元素数组初始化器的数组。

我怀疑你可能真的想看一些矩阵库,这些矩阵库可以更容易地处理数学结构。