【问题标题】:How to declare and initialize in a 4-dimensional array in C如何在 C 中的 4 维数组中声明和初始化
【发布时间】:2013-11-20 17:17:15
【问题描述】:

我对编程比较陌生,我需要输入一个 4 维数组,我几乎无法理解它。所以,让我们从一个简单的 3-d 数组开始,每个元素有 2 个,如下所示:

int arr[2][2][2] = 
{
    {
        {1, 2}
        {3, 4}    //redline on "{"
    }
    {             //redline on "{"
        {5, 6}
        {7, 8}
    }
};

VS-2012 在“3”之前将“{”红线,并表示它需要一个“}”。我怎样才能以整洁的格式输入数组?有4个维度会更复杂,我需要能够看清楚数据。

另外,我的数组中会有很多零,本质上每个 arr[n][n] 都会为 0,所以我想知道是否可以让初始化更简单一些。

我的数组将是类型

int arr[7][7][15][2]

或者我最好改用 struct 吗?

提前致谢!

【问题讨论】:

  • 你也必须在连续的括号'元素'之间添加逗号。
  • int arr[2][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};
  • 正如亚历山大所说,初始化中“}”后面的逗号。

标签: c arrays multidimensional-array


【解决方案1】:

四维数组的表示

int arr[2][2][2][2] = 
{
    { { {1, 2}, {3, 4} }, { {5, 6}, {7, 8} } }, 
    { { {9,10}, {11, 12} }, { {13, 14}, {15, 16} } }
};

【讨论】:

    【解决方案2】:

    记住C 总是使用行主要顺序 为静态声明的数组分配内存。 例如

    • 在二维数组的情况下,比如int A[3][2],内存分配从第一个元素开始,即A[0][0],然后A[0][1],然后跳转到下一行,但内存分配将是连续的,因此是下一个元素内存布局的顺序是A[1][0],然后是A[1][1] -> A[2][0] -> A[2][1]
    • 因此,在您的初始化情况下,更简单的方法是以一维形式将其线性可视化并写下来。

    int arr[2][3][4] = {1,2,1,2,1,2,1,4,1,2,4,4,1,1,2,4,1,2,1,4,1,2,1,4};

    【讨论】:

      【解决方案3】:

      在外大括号内,内大括号{ } 表示矩阵行。但是哪些逗号是必需的?哪些逗号是可选的?

      在 C 1999 中的二维数组声明初始化:

      1. 内括号表示矩阵行。

      2. 每两个相邻的矩阵元素初始化值之间必须出现逗号(即使用换行符分隔)。

      3. 相邻的内大括号对之间应出现逗号;但是,在某些标准编译器 (?) 中,此逗号可能是可选的。

      4. 每行最后一个元素后的尾随逗号是可选的(如果使用内括号)。

      5. 最后一个内括号后的尾随逗号是可选的。

      6. 最后一个大括号后的尾随分号是必需的。

      (标准 C 1999 的专家可以编辑以上列表以更正任何错误陈述吗?)

      【讨论】:

        【解决方案4】:

        例如,每个括号内的元素都可以被视为ints 中的{ 1, 2 } 之一。使用列表进行初始化表示使用逗号枚举单独的元素。因此,正确的语法将在每个括号数组后使用逗号 ({ { 1, 2 }, { 3, 4 } }):

        int arr[2][2][2] = 
        {
            {
                {1, 2},
                {3, 4}
            },
            {            
                {5, 6},
                {7, 8}
            }
        };
        

        对于四维数组,您必须编写大量“硬编码”代码;你最好写一个函数来为你填充值。

        【讨论】:

          【解决方案5】:

          您缺少,

          对于一个三维数组

           int arr[2][3][4] = { 
                                 { 
                                    {1, 2, 1, 2}, {1, 2, 1, 4}, {1, 2, 4, 4} 
                                 },
                                 {  
                                    {1, 1, 2, 4}, {1, 2, 1, 4}, {1, 2, 1, 4} 
                                 } 
                              };
          
          or int arr[2][3][4] = {1,2,1,2,1,2,1,4,1,2,4,4,1,1,2,4,1,2,1,4,1,2,1,4}; 
          

          对于一个四维数组

          int arr[2][3][4][2] = {
                                  {
                                    {
                                      {1,2},{1,2},{1,2},{4,2}
                                    },
                                    {
                                      {2, 4},{1, 4},{1, 4},{1,2}
                                    },
                                    {
                                      {2, 4},{1, 4},{1, 4},{1,8}
                                    }
                                 },
                                 {
                                   {
                                     {1,2},{1,2},{1,2},{4,2}
                                   },
                                   {
                                     {2, 4},{1, 4},{1, 4},{1,2}
                                   },
                                   {
                                     {2, 4},{1, 4},{1, 4},{1,2}
                                   }
                                }
                              };
          

          【讨论】:

          • 谢谢大家!我确实需要对数组进行硬编码,因为程序会通过它进行一些疯狂的搜索。
          • 这不是真正的“, 运算符”。这只是一个逗号,一个初始化器的句法元素。 Is 与 , 运算符无关。
          猜你喜欢
          • 1970-01-01
          • 2021-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-20
          • 2016-11-05
          相关资源
          最近更新 更多