#ifndef _MATRIX_H_ #define _MATRIX_H_ template<typename Type> void Matrix3D(Type*** &matrix, int nDepth, int nHeight, int nWidth) { int nPlaneSize =nDepth * nHeight * nWidth * sizeof(Type); int nPlaneIndexSize = nDepth * sizeof(Type***); int nIndexSize = nDepth * nHeight * sizeof(Type**); matrix = NULL; matrix = (Type***) new char[nPlaneSize + nPlaneIndexSize + nIndexSize]; // 预分配空间(平面索引区,数据索引区,数据区),平面索引区的首地址为matrix Type** startDataIndex = NULL; // 数据索引区的首地址 startDataIndex = (Type**)((char*)matrix + nDepth * sizeof(Type***)); Type* startData = NULL; // 数据区首地址 startData = (Type*)((char*)startDataIndex + nHeight * nDepth * sizeof(Type**)); memset(startData, 0, nHeight * nWidth * nDepth * sizeof(Type)); // 索引平面 int i = 0, j = 0; Type*** planeIndex = matrix; Type** plane = startDataIndex; for (i=0; i<nDepth; i++) { *(planeIndex + i) = plane; plane += nHeight; } plane = startDataIndex; // 索引数据 Type* data = startData; for (i=0; i<nDepth; i++) { for (j=0; j<nHeight; j++) { *(plane+j) = data; data += nWidth; } plane += nHeight; } } #endif 代码是对算法的最好描述,所以不准备对设计思路多费口舌了。 下面是测试用的 #include <iostream> #include "matrix.h" using std::endl; using std::cout; using std::cin; int main() { double ***pd = NULL; int nHeight, nWidth, nDepth; nHeight = nWidth = 3; nDepth = 5; Matrix3D(pd, nDepth, nHeight, nWidth); double val = 0; for (int k = 0; k<nDepth; k++) { for (int i = 0; i<nHeight; i++) { for (int j=0; j<nWidth; j++) { pd[k][i][j] = val++; cout << pd[k][i][j]<<"/t"; } cout << endl; } cout << endl; } return 0; }