繁体   English   中英

我怎样才能在c中创建一个n维数组

[英]How can i create an n-dimensional array in c

我正在考虑编写一个带有n个参数的函数,并使用这些参数作为维度返回一个n维数组。 现在我意识到使用指针很容易实现一维和二维数组。 对于2d数组,代码片段就像(标准方式):

int** x;
int* temp;

x = (int**)malloc(m * sizeof(int*));
temp = (int*)malloc(m*n * sizeof(int));
for (int i = 0; i < m; i++) {
  x[i] = temp + (i * n);
}

数组的大小为m * n; 但问题在于我们如何找到n维数组的嵌套循环参数? 有没有办法优化代码?

这显示了如何创建N维数组以及如何索引其元素。 这些提供了所需的基本机制。 这是学生在学习时考虑的事情,但在实践中很少使用。 通常有更好的方法来组织数据结构。 此外,大多数有用的算法都会有关于它们如何遍历数据的模式,因此最好构建以增量方式有效更新索引的代码,而不是从头开始重新计算它们,如下所示。

/*  Note:  For demonstration purposes only.  Depending on needs, other types
    might be used for indices and sizes, and the array type might be wrapped
    in an opaque struct rather than exposed as "int *".
*/


//  Create an array with N dimensions with sizes specified in D.
int *CreateArray(size_t N, size_t D[])
{
    //  Calculate size needed.
    size_t s = sizeof(int);
    for (size_t n = 0; n < N; ++n)
        s *= D[n];

    //  Allocate space.
    return malloc(s);
}

/*  Return a pointer to an element in an N-dimensional A array with sizes
    specified in D and indices to the particular element specified in I.
*/
int *Element(int *A, size_t N, size_t D[], size_t I[])
{
    //  Handle degenerate case.
    if (N == 0)
        return A;

    //  Map N-dimensional indices to one dimension.
    int index = I[0];
    for (size_t n = 1; n < N; ++n)
        index = index * D[n] + I[n];

    //  Return address of element.
    return &A[index];
}

使用示例:

//  Create a 3*3*7*7*9 array.
size_t Size[5] = { 3, 3, 7, 7, 9 };
int *Array = CreateArray(5, Size);

//  Set element [1][2][3][4][5] to -987.
*Element(Array, 5, Size, (size_t []) { 1, 2, 3, 4, 5 }) = -987;

我不想使用多维数组,而是使用1D:

int* pArray = (int*) malloc(m * n * sizeof(int*));

// access pArray[a][b]
int result = pArray[a*m + b];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM