gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:53:20 24 4
gpt4 key购买 nike

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

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 维数组以及如何对其元素进行索引。这些提供了所需的基 native 制。这是学生在学习时考虑的,但在实践中很少用到。通常有更好的方法来组织数据结构。此外,大多数有用的算法都具有遍历数据的模式,因此最好构建以增量方式有效更新索引的代码,而不是如下所示从头开始重新计算它们。

/*  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;

关于c - 我怎样才能在c中创建一个n维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com