我在网上寻找一种动态分配3d矩阵空间的方法,比如int类型。
我发现了很多关于二维矩阵的网站
http://www.taranets.com/cgi/ts/1.37/ts.ws.pl?w=329;b=286
下面是这个例子。
我理解以上所有的例子,但这与三维我不能。造物主是以向后的方式分配空间还是其他什么?
他开始分配整个矩阵的空间,然后进行到Z轴?这是我无法理解的。
另外,如果你知道任何有关这方面的好网站,张贴在这里,将不胜感激。
/* Program 9.4 from PTRTUT10.HTM 6/13/97 */
// http://www.taranets.com/cgi/ts/1.37/ts.ws.pl?w=329;b=286
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
int X_DIM=16;
int Y_DIM=5;
int Z_DIM=3;
int main(void)
{
char *space;
char ***Arr3D;
int y, z;
ptrdiff_t diff;
/* first we set aside space for the array itself */
space = malloc(X_DIM * Y_DIM * Z_DIM * sizeof(char));
/* next we allocate space of an array of pointers, each
to eventually point to the first element of a
2 dimensional array of pointers to pointers */
Arr3D = malloc(Z_DIM * sizeof(char **));
/* and for each of these we assign a pointer to a newly
allocated array of pointers to a row */
for (z = 0; z < Z_DIM; z++)
{
Arr3D[z] = malloc(Y_DIM * sizeof(char *));
/* and for each space in this array we put a pointer to
the first element of each row in the array space
originally allocated */
for (y = 0; y < Y_DIM; y++)
{
Arr3D[z][y] = space + (z*(X_DIM * Y_DIM) + y*X_DIM);
}
}
/* And, now we check each address in our 3D array to see if
the indexing of the Arr3d pointer leads through in a
continuous manner */
for (z = 0; z < Z_DIM; z++)
{
printf("Location of array %d is %p\n", z, *Arr3D[z]);
for ( y = 0; y < Y_DIM; y++)
{
printf(" Array %d and Row %d starts at %p\n", z, y, Arr3D[z][y]);
diff = Arr3D[z][y] - space;
printf(" diff = %d ",diff);
printf(" z = %d y = %d", z, y);
}
putchar('\n');
}
putchar('\n');
system("PAUSE");
return 0;
}
最佳答案
空间实际上是为整个矩阵分配的内存。
但是,他继续创建指向位于
Arr3D = malloc(Z_DIM * sizeof(char **));
ARR3D的目的仅仅是通过索引(指定Z、Y、X索引)访问空间的一种方式。空间只有一个索引,所以如果您想通过空间访问矩阵元素,您需要将其转换为一个单独的
[a][b][c]
,其中d类似于space[d]
。因此,使用Arr3D,您可以通过a*Y_DIM*Z_DIM + b*Z_DIM+c
访问[a][b][c]
。Arr3D[a][b][c]
本身是一个Arr3D
数组,它是指向char类型指针的指针。char**
则是指向字符指针数组的指针。然后将每个Arr3D[z]
设置为指向原始3x3矩阵中的特定行Arr3D[z][y] = space + (z*(X_DIM * Y_DIM) + y*X_DIM);
然后使用
Arr3D[z][y]
访问矩阵的Arr[1][2]
行。