【问题标题】:2D Array initialization of columns vs rows列与行的二维数组初始化
【发布时间】:2016-05-10 07:34:18
【问题描述】:
如果我有一个这样的 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
如何交换或更改数组顺序为这样?
【问题讨论】:
标签:
c
arrays
column-major-order
row-major-order
【解决方案1】:
你想要这个:
int arr[3][5] ={{10},{8},{9}};
这会初始化三个第一维数组中的每一个,并且每个都显式地仅初始化第一个元素,导致其余元素设置为 0。
分解上面的初始化,arr是一个大小为3的数组,其中每个元素是一个大小为5的int数组。所以{10}初始化这3个数组元素中的第一个,{8}初始化第二个,{9} 初始化第三个。并且因为每个只初始化每个子数组的 5 个元素中的第一个,其余的都初始化为 0。
来自C standard 的第 6.7.9 节:
19 初始化应按初始化列表顺序进行,每个
为覆盖任何特定子对象提供的初始化程序
先前列出的相同子对象的初始化程序; 所有子对象
未显式初始化的将被隐式初始化
与具有静态存储持续时间的对象相同。
【解决方案2】:
为什么不写
int arr[3][5] = { {10, 0, 0, 0, 0},
{8, 0, 0, 0, 0},
{9, 0, 0, 0, 0 }};
即初始化数组中的每个元素
【解决方案3】:
使用指定的初始化器:
int test[3][5] = { [0][0] = 10 , [1][0] = 8 , [2][0] = 9 } ;
【解决方案4】:
如何交换或更改数组顺序为这样?
在 C 中,一点也不。这不是 C 的语言特性。
您必须使用 for 循环或类似的东西来遍历行而不是列,或者使用单元素数组初始化器的数组。
我怀疑您可能真的想查看一些矩阵库,这些矩阵库可以更轻松地处理数学结构。