/************************************************************************/ /* 假定三维数组是: MyInfo arrayInfo[2][3][4]; */ /************************************************************************/ typedef struct tagMyInfo { unsigned char ucInfo1; unsigned char ucInfo2; }MyInfo; int iMax = 2; int jMax = 3; int kMax = 4; int i = 0; int j = 0; int k = 0; MyInfo ***pppMyInfo = (MyInfo ***)malloc(iMax*jMax*kMax*sizeof(MyInfo) + iMax*jMax*sizeof(MyInfo*)); /*初始化*/ for (i=0; i<iMax; i++) { pppMyInfo[i] = (MyInfo**)((char*)pppMyInfo + iMax*sizeof(MyInfo*) + i*jMax*kMax*sizeof(MyInfo)); for (j=0; j<jMax; j++) { pppMyInfo[i][j] = (MyInfo*)((char*)(pppMyInfo[i]) + jMax*sizeof(MyInfo*) + j*kMax*sizeof(MyInfo)); for (k=0; k<kMax; k++) { memset(pppMyInfo[i][j]+k, 0, sizeof(MyInfo)); } } } /*像静态数组一样使用*/ pppMyInfo[0][0][0].ucInfo1 = 0; pppMyInfo[0][0][0].ucInfo2 = 1; pppMyInfo[1][2][3].ucInfo1 = 23; pppMyInfo[1][2][3].ucInfo2 = 24; printf("\r\n %u, %u", pppMyInfo[0][0][0].ucInfo1, pppMyInfo[0][0][0].ucInfo2); printf("\r\n %u, %u", pppMyInfo[1][2][3].ucInfo1, pppMyInfo[1][2][3].ucInfo2); /************************************************************************/ /* 二维数组也是同样,更简单一点; */ /************************************************************************/ MyInfo **ppMyInfo = (MyInfo **)malloc(iMax*jMax*sizeof(MyInfo) + iMax*sizeof(MyInfo*)); /*初始化*/ for (i=0; i<iMax; i++) { ppMyInfo[i] = (MyInfo*)((char*)ppMyInfo + iMax*sizeof(MyInfo*) + i*jMax*sizeof(MyInfo)); for (j=0; j<jMax; j++) { memset(ppMyInfo[i]+j, 0, sizeof(MyInfo)); } } /*像静态数组一样使用*/ ppMyInfo[0][0].ucInfo1 = 0; ppMyInfo[0][0].ucInfo2 = 1; ppMyInfo[1][2].ucInfo1 = 5; ppMyInfo[1][2].ucInfo2 = 6; printf("\r\n %u, %u", ppMyInfo[0][0].ucInfo1, ppMyInfo[0][0].ucInfo2); printf("\r\n %u, %u", ppMyInfo[1][2].ucInfo1, ppMyInfo[1][2].ucInfo2); free(pppMyInfo); free(ppMyInfo);
今天用到了3级指针,其实工作中还是很少使用这种东西的,尤其是我现在的工作对于编程技巧要求不高,相对的行业专业性知识和业务能力更重要;
记得当初找工作时还有公司笔试过类似的题,就顺便贴出来,希望对有需要的人能有所帮助,折腾明白这个,对指针就应该有一个较好的掌握了;
当然,实现方式不唯一,比如可以针对每个一维数组分多次申请内存,也可以像下面这样做一下调整
/************************************************************************/
/* 还可以将用于存放中间指针地址的内存并在一起,这样数据元素能连续存放 */
/************************************************************************/
for (i=0; i<iMax; i++)
{
pppMyInfo[i] = (MyInfo**)((char*)pppMyInfo + iMax*jMax*sizeof(MyInfo*) + i*jMax*kMax*sizeof(MyInfo));
for (j=0; j<jMax; j++)
{
pppMyInfo[i][j] = (MyInfo*)((char*)(pppMyInfo[i]) + j*kMax*sizeof(MyInfo));
for (k=0; k<kMax; k++)
{
memset(pppMyInfo[i][j]+k, 0, sizeof(MyInfo));
}
}
}