在运行时将一维数组处理为二维

时间:2015-08-31 18:28:43

标签: c arrays

我有一些数据存储在一个大小为'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*/

5 个答案:

答案 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;
}

另见问题Convert Array Question

这样做有一些固有的不安全感,但你的问题是NxP = M,所以如果这是真的,它会起作用。人们会皱眉头。