动态申请3维数组
此题要求深刻理解:1指针的概念,2指针的数组操作和静态的数组操作之间的区别。
下面的代码是动态申请三维数组Arr[a][b][c],
- *data ------- 指向存储数据的一维数组,总共有a*b*c个元素。
- **fp ------- 第一层指针,总共有a*b个元素,每个元素为指向data某一段首的指针。每一段长为c,因为三维数组相当于a*b个c组成。
- ***sp -------- 第二层指针,总共有a个元素,每个元素为指向fp某一段首的指针。每一段厂为b。
然后再分别把指针赋值上就行了。使用的时候,p[i][j] = *((*(p+i))+j).方便很多。
//以下代码copy right by Jack204.使用请注名出处。
#include <stdio.h> #include <stdlib.h> /** *class A { *..... */ //为简洁,先写完代码,再添加参数验证的异常处理。 //申请成功返回>0,否则=0。 int *** allocArr(int a, int b, int c) { int *data, **fp, ***sp; int i, j, *q; data = (int*)malloc(sizeof(int)*a*b*c); fp = (int**)malloc(sizeof(int*)*a*b); sp = (int***)malloc(sizeof(int**)*a); for(i=0; i<a; i++) { sp[i] = fp + i*b; q = data + i*b*c; for (j=0; j<b; j++) { sp[i][j] = q; q += c; } } return sp; } void freeArr(int ***sp) { free(sp[0][0]); free(sp[0]); free(sp); } int main() { int i, j, k; int ***p = allocArr(2, 3, 4); for (i=0; i<2; i++) for (j=0; j<3; j++) for (k=0; k<4; k++) p[i][j][k] = i+j+k; printf("val=%d\n", p[0][2][3]); freeArr(p); return 0; } /** *..... *} */