【问题标题】: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 } ;
        

        【讨论】:

        • 有趣的通用方法:LSNED
        【解决方案4】:

        如何交换或更改数组顺序为这样?

        在 C 中,一点也不。这不是 C 的语言特性。

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

        我怀疑您可能真的想查看一些矩阵库,这些矩阵库可以更轻松地处理数学结构。

        【讨论】:

          猜你喜欢
          • 2012-11-29
          • 2013-11-21
          • 2012-05-20
          • 1970-01-01
          • 2021-02-22
          • 2011-12-08
          相关资源
          最近更新 更多