C中的二维数组,具有可变的第二维

时间:2016-01-28 16:26:27

标签: c arrays pointers multidimensional-array

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

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

什么行不通。有没有办法到那里 array[0] = 1, array[1] = 2 array[2]=3的长度?

4 个答案:

答案 0 :(得分:3)

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

这是一个示范程序

#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 

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

答案 1 :(得分:3)

  

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

>>> s='aria-label="like this video along with **3,358,980** other people"'
>>> print(re.search(r"([\d,]+)", s).group(0))
3,358,980
     

[...]有没有办法到达那里数组[0] = 1,数组[1] = 2和数组[2] = 3的长度?

不,没有。

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

C 2D数组是一种数组,其中元素类型是特定的数组类型(因此,具有特定数量的元素)。因此,

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

int array[3][2]; 声明为包含三个元素的数组,每个元素都包含两个array的数组。

你可以做的是为各种长度的数组提供一个指针数组。例如:

int

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

答案 2 :(得分:1)

Yo可以将您的数据存储在线性阵列中。数组的大小增加了一排三角形数字( 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;
}

答案 3 :(得分:0)

您是否会提前知道第二个数组的大小是多少?

你应该能够定义一个函数,它接受第二个数组的大小作为输入,用

初始化它
array buildArr(int size) {

    int[][] newArr = new int [whatever][size]();

    return newArr;

}