我正在考虑编写一个带有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维数组的嵌套循环参数?有没有办法优化代码?
答案 0 :(得分:8)
这显示了如何创建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;
答案 1 :(得分:2)
我不想使用多维数组,而是使用1D:
int* pArray = (int*) malloc(m * n * sizeof(int*));
// access pArray[a][b]
int result = pArray[a*m + b];