【问题标题】:2D array in C with variable 2nd dimensionC中具有可变二维的二维数组
【发布时间】:2016-01-28 16:26:26
【问题描述】:

是否可以在 C 中定义具有可变(但固定)第二维的二维数组? 所以我想要的或多或少是这样的

    int array[3][] = {{1},{1,2},{1,2,3}}

什么不起作用。有没有办法到达那里 array[0] = 1, array[1] = 2 和array[2]=3的长度在哪里?

【问题讨论】:

  • 您能澄清一下“可变(但固定)”的含义吗?你的意思是你希望每一行都是不同的长度,正如你的初始化程序所建议的那样?
  • 可变但固定我的意思是,每行可能有不同的长度(可变),但我事先知道它应该具有的大小(“但固定”)。很抱歉造成混乱

标签: c arrays pointers multidimensional-array


【解决方案1】:

是否可以在 C 中定义具有可变(但固定)第二维的二维数组?所以我想要的或多或少是这样的

int array[3][] = {{1},{1,2},{1,2,3}}

[...] 有什么方法可以到达数组[0] = 1、数组[1] = 2 和数组[2]=3 的长度?

不,没有。

C 数组是相同类型元素的序列。元素的数量和类型是每个数组type 的属性,而不是具有该类型的数组对象的属性。 C 数组索引基本上取决于此。

C 二维数组是元素类型为特定数组类型(因此具有特定数量的元素)的数组。因此,

int array[3][2];

声明array 是一个由三个元素组成的数组,每个元素都是由两个ints 组成的数组。

你可以做的是有一个指针数组,指向不同长度的数组。例如:

int el0[] = { 1 };
int el1[] = { 1, 2 };
int el2[] = { 1, 2, 3 };
int *array[] = { el0, el1, el2 };

在某些重要方面,您可以像处理真正二维数组一样处理这样的数组。但是请注意,这需要对指向数组的长度进行假设或单独记账,并且三个一维数组在内存中不一定是连续的。

【讨论】:

    【解决方案2】:

    您可以使用复合文字。但是,如果内部数组的维度没有按顺序增加,则必须将维度存储在其他数组中。

    这是一个演示程序

    #include <stdio.h>
    
    int main( void )
    {
        int *a[] = 
        {
            ( int[] ){ 1 }, ( int [] ){ 1, 2 }, ( int [] ){ 1, 2, 3 }
        };
    
        for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ )
        {
            for ( size_t j = 0; j <= i; j++ ) printf( "%d ", a[i][j] );
            printf( "\n" );
        }
    }    
    

    它的输出是

    1 
    1 2 
    1 2 3 
    

    也就是说,您有一个指针数组,每个指针指向适当维度的未命名数组的第一个元素。 在此示例中,未命名数组与指针数组具有相同的自动存储持续时间。

    【讨论】:

    • 感谢弗拉德,这实际上是约翰在我接受的答案中所解释的。抱歉没有选择你的,但 johns 的解释照亮了它更容易理解,这也可能对其他人有所帮助
    【解决方案3】:

    您可以将数据存储在线性化数组中。数组的大小按三角形数的行( 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 ... )增长。 如果您有一个索引[x][y],您可以通过公式[ y*(y+1)/2 + x ] 计算线性化三角数组中的索引,其中x 必须小于或等于y。

    int main(void)
    {
        int rows = 10;
        int size = rows*(rows+1)/2; // size of linearized array
        int *triangularArray = malloc( sizeof( int ) * size );
    
        for ( int y = 0; y < rows; y ++ )
        {
            for ( int x = 0; x <= y; x ++ )
            {
                int index = y*(y+1)/2 + x; // linearized index for [x][y] ( x <= y )
                triangularArray[ index ] = x+1;
            }
        }
    
        for ( int i = 0; i < size; i ++ )
        {
            if ( i > 0 && triangularArray[i] <= triangularArray[i-1] )
                printf( "\n" );
            printf( "%3d", triangularArray[i] );
        }
    
        free( triangularArray );
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      您会提前知道第二个数组的大小吗?

      您应该能够定义一个函数,将第二个数组的大小作为输入来初始化它

      array buildArr(int size) {
      
          int[][] newArr = new int [whatever][size]();
      
          return newArr;
      
      }
      

      【讨论】:

      • 那是 C++,不是 C。
      • 不,这会给我留下一个在第二维中具有长度大小的数组,但我希望第二维的长度是可变的(但固定)
      • @ryyker,他似乎的意思是他希望二维数组的每个(一维数组)元素都有自己的、独立的、固定的长度。
      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多