我有一些数据存储在一个大小为'M'的一维数组中。现在我需要将它视为具有NxP维度的二维数组,其中N和P的乘积等于M.我只知道运行时N和P的值。如何在C中实现这样的功能?
int array[M]; /* one dimensional array where some data is stored*/
int** newArray; /* the dimension of newArray should be NxP such that we can access the data in 'array' as a two-dimensional array*/
答案 0 :(得分:4)
将其强制转换为适当的数组指针类型:
int (*newArray)[N] = (int (*)[N])array;
之后,您可以使用以下命令访问该数组:
for(int y = 0; y < P; y++) {
for(int x = 0; x < N; x++) {
array[y][x] = 42;
}
}
这相当于以下索引:
for(int y = 0; y < P; y++) {
for(int x = 0; x < N; x++) {
newArray[y*N + x] = 42;
}
}
即使N
仅在C99运行时知道,这也有效。请注意,您不需要像使用int**
那样设置索引数组。
答案 1 :(得分:1)
您不需要定义新阵列。您可以使用现有的。
假设您知道N和P,并且N是行数,您可以访问项目(i,j):
array[i*N + j]
答案 2 :(得分:1)
你可以这样做:
int ** newArray = malloc(sizeof(int*) * N);
for (i = 0; i < N; ++i) {
newArray[i] = array[i * J];
}
这会产生一个&#34;看起来&#34;就像动态分配的N行和J列的2D数组一样,但实际上指的是1D数组的行。
这样,如果您已经具有在2D阵列上操作的功能,那么您不需要重写它们以使用其他答案中描述的1D语法。
答案 3 :(得分:1)
运行时使这有点困难,但是: -
newArray = malloc( sizeof( int*) * N ); /* create an array of pointers.
{
size_t i;
for( i = 0; i < N; i++ ) {
newArray[i] = &array[ i* P];
}
}
/ *现在newArray [i] [j]可用* /
答案 4 :(得分:0)
您可以将1d数组转换为所需的2d数组。它只是一块记忆。
int _tmain(int argc, _TCHAR* argv[])
{
int oneDArray[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
int(*twoDArray)[3] = (int(*)[3])&oneDArray[0]; // This is the magic line!
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("i: %d j: %d value: %d\r\n", i, j, twoDArray[i][j]);
}
}
_getch();
return 0;
}
这样做有一些固有的不安全感,但你的问题是NxP = M,所以如果这是真的,它会起作用。人们会皱眉头。