数码相框browse_page代码部分这里为什么要使用双重指针,甚至三重指针?

int GetDirContents(char *strDirName, PT_DirContent **pptDirContents, int *piNumber)
{
PT_DirContent *aptDirContents;
struct dirent **aptNameList;
int iNumber;
int i;
int j;

/* 扫描目录,结果按名字排序,存在aptNameList[0],aptNameList[1],... */
iNumber = scandir(strDirName, &aptNameList, 0, alphasort);
if (iNumber < 0)
{
	DBG_PRINTF("scandir error : %s!\n", strDirName);
	return -1;
}

/* 忽略".", ".."这两个目录 */
aptDirContents = malloc(sizeof(PT_DirContent) * (iNumber - 2)); // 分配多个目录的内存,这里只存放了指向多个目录的地址
if (NULL == aptDirContents)
{
	DBG_PRINTF("malloc error!\n");
	return -1;
}
*pptDirContents = aptDirContents;

for (i = 0; i < iNumber - 2; i++)
{
	aptDirContents[i] = malloc(sizeof(T_DirContent)); // 分配单个目录的内存
	if (NULL == aptDirContents)
	{
		DBG_PRINTF("malloc error!\n");
		return -1;
	}
}

/* 先把目录挑出来存入aptDirContents */
for (i = 0, j = 0; i < iNumber; i++)
{
	/* 忽略".",".."这两个目录 */
	if ((0 == strcmp(aptNameList[i]->d_name, ".")) || (0 == strcmp(aptNameList[i]->d_name, "..")))
		continue;
    /* 并不是所有的文件系统都支持d_type, 所以不能直接判断d_type */
	/* if (aptNameList[i]->d_type == DT_DIR) */
    if (isDir(strDirName, aptNameList[i]->d_name))
	{
		strncpy(aptDirContents[j]->strName, aptNameList[i]->d_name, 256);
		aptDirContents[j]->strName[255] = '\0';
		aptDirContents[j]->eFileType    = FILETYPE_DIR;
        free(aptNameList[i]);
        aptNameList[i] = NULL;
		j++;
	}
}

/* 再把常规文件挑出来存入aptDirContents */
for (i = 0; i < iNumber; i++)
{
    if (aptNameList[i] == NULL)
        continue;
    
	/* 忽略".",".."这两个目录 */
	if ((0 == strcmp(aptNameList[i]->d_name, ".")) || (0 == strcmp(aptNameList[i]->d_name, "..")))
		continue;
    /* 并不是所有的文件系统都支持d_type, 所以不能直接判断d_type */
	/* if (aptNameList[i]->d_type == DT_REG) */
    if (isRegFile(strDirName, aptNameList[i]->d_name))
	{
		strncpy(aptDirContents[j]->strName, aptNameList[i]->d_name, 256);
		aptDirContents[j]->strName[255] = '\0';
		aptDirContents[j]->eFileType    = FILETYPE_FILE;
        free(aptNameList[i]);
        aptNameList[i] = NULL;
		j++;
	}
}

/* 释放aptDirContents中未使用的项 */
for (i = j; i < iNumber - 2; i++)
{
	free(aptDirContents[i]);
}

/* 释放scandir函数分配的内存 */
for (i = 0; i < iNumber; i++)
{
    if (aptNameList[i])
    {
		free(aptNameList[i]);
    }
}
free(aptNameList);

*piNumber = j;

return 0;

} 就是pptDirContents和aptDirContents这两个变量