程序代码:
#include <stdio.h>
#include <stdlib.h>
static int *pArray; // 指向一个任意维数的数组
static int *pDimensions; // 所有维数
static int Dimension; // 维数
// 初始化数组
int *initArray(int dimension, ...)
{
int i, j = 1;
Dimension = dimension;
pDimensions = malloc(sizeof(int) * dimension);
for (i = 1; i <= dimension; i++) {
pDimensions[i - 1] = (&dimension)[i];
j *= (&dimension)[i];
}
pArray = malloc(sizeof(int) * j);
}
// 根据索引获得值
int get(int dimension, ...)
{
int i, j, k, offset = (&dimension)[dimension];
for (i = 1; i < dimension; i++) {
k = 1;
for (j = 1; j <= i; j++)
k *= pDimensions[dimension - j];
offset += k * (&dimension)[dimension - i];
}
return pArray[offset];
}
// 根据索引设置值
void set(int value, ...)
{
int i, j, k, offset = (&value)[Dimension];
for (i = 1; i < Dimension; i++) {
k = 1;
for (j = 1; j <= i; j++)
k *= pDimensions[Dimension - j];
offset += k * (&value)[Dimension - i];
}
pArray[offset] = value;
}
// 释放内存
void destroy()
{
free(pArray);
free(pDimensions);
}
int main(void)
{
/*
initArray(2, 3, 4) -> int[3][4]
initArray(1, 5) -> int[5]
initArray(3, 3, 3, 3) -> int[3][3][3]
...
*/
initArray(3, 3, 3, 3); // 三维数组
int a[3][3][3];
int i, j, k, count = 1;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++) {
set(count, i, j, k);
a[i][j][k] = count++;
}
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
printf("a[%d][%d][%d]: %d\nget(%d, %d, %d, %d): %d\n", i, j, k, a[i][j][k], 3, i, j, k, get(3, i, j, k));
destroy();
}
/*
a[0][0][0]: 1
get(3, 0, 0, 0): 1
a[0][0][1]: 2
get(3, 0, 0, 1): 2
a[0][0][2]: 3
get(3, 0, 0, 2): 3
a[0][1][0]: 4
get(3, 0, 1, 0): 4
a[0][1][1]: 5
get(3, 0, 1, 1): 5
a[0][1][2]: 6
get(3, 0, 1, 2): 6
a[0][2][0]: 7
get(3, 0, 2, 0): 7
a[0][2][1]: 8
get(3, 0, 2, 1): 8
a[0][2][2]: 9
get(3, 0, 2, 2): 9
a[1][0][0]: 10
get(3, 1, 0, 0): 10
a[1][0][1]: 11
get(3, 1, 0, 1): 11
a[1][0][2]: 12
get(3, 1, 0, 2): 12
a[1][1][0]: 13
get(3, 1, 1, 0): 13
a[1][1][1]: 14
get(3, 1, 1, 1): 14
a[1][1][2]: 15
get(3, 1, 1, 2): 15
a[1][2][0]: 16
get(3, 1, 2, 0): 16
a[1][2][1]: 17
get(3, 1, 2, 1): 17
a[1][2][2]: 18
get(3, 1, 2, 2): 18
a[2][0][0]: 19
get(3, 2, 0, 0): 19
a[2][0][1]: 20
get(3, 2, 0, 1): 20
a[2][0][2]: 21
get(3, 2, 0, 2): 21
a[2][1][0]: 22
get(3, 2, 1, 0): 22
a[2][1][1]: 23
get(3, 2, 1, 1): 23
a[2][1][2]: 24
get(3, 2, 1, 2): 24
a[2][2][0]: 25
get(3, 2, 2, 0): 25
a[2][2][1]: 26
get(3, 2, 2, 1): 26
a[2][2][2]: 27
get(3, 2, 2, 2): 27
Process returned 1 (0x1) execution time : 0.359 s
Press any key to continue.
*/
[
本帖最后由 lz1091914999 于 2011-10-5 21:55 编辑 ]