是否可以在C中定义具有可变(但固定)第二维的二维数组? 所以我想要的或多或少像
int array[3][] = {{1},{1,2},{1,2,3}}
什么行不通。有没有办法到那里
array[0] = 1, array[1] = 2
和array[2]=3
的长度?
答案 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;
}