#include <stdio.h>
#define ASSERT_POINTER_RET_VAR_T(p, str, ret)/
if (NULL == p)/
{/
printf("error: invalid pointer: %s", str);/
return ret;/
}
int TwoPointerTestInt(int **ppnInput, int nLen)
{
int nIdx;
printf("int TwoPointerTestInt(int **ppnInput, int nLen) run /n");
ASSERT_POINTER_RET_VAR_T(ppnInput, "ppnInput", 0);
ASSERT_POINTER_RET_VAR_T(*ppnInput, "*ppnInput", 0);
for (nIdx = 0; nIdx < nLen; nIdx++)
{
printf("/t%d/n", *(ppnInput+nIdx)); // 地址偏移sizeof(int) 4个字节
}
return 1;
}
int TwoPointerTestChar(char **ppchInput, int nLen)
{
int nIdx;
printf("int TwoPointerTestChar(char **ppchInput, int nLen) run /n");
ASSERT_POINTER_RET_VAR_T(ppchInput, "ppchInput", 0);
ASSERT_POINTER_RET_VAR_T(*ppchInput, "*ppchInput", 0);
for (nIdx = 0; nIdx < nLen; nIdx++)
{
printf("/t%c/n", *((char *)ppchInput+nIdx)); // 地址偏移sizeof(char) 1个字节
}
return 1;
}
int TwoPointerTestStr(char **ppchInput, int nLen)
{
int nIdx;
printf("int TwoPointerTestStr(char **ppchInput, int nLen) run /n");
ASSERT_POINTER_RET_VAR_T(ppchInput, "ppchInput", 0);
ASSERT_POINTER_RET_VAR_T(*ppchInput, "*ppchInput", 0);
for (nIdx = 0; nIdx < nLen; nIdx++)
{
printf("/t%s/n", *(ppchInput+nIdx)); // 地址偏移sizeof(*pointer) 4个字节
}
return 1;
}
int main(void)
{
int aanData[2][3] =
{
{1, 2, 3,},
{5, 6, 7,},
};
char aachData[2][3] =
{
{'A', 'B', 'C',},
{'X', 'Y', 'Z',},
};
char *pachData[2][3] =
{
{"Today", "is a ", "very",},
{"Good day", "for ", "us to happy !",},
};
TwoPointerTestInt((int **)aanData, sizeof(aanData)/sizeof(int));
printf("/n");
TwoPointerTestChar((char **)aachData, sizeof(aachData)/sizeof(char));
printf("/n");
TwoPointerTestStr((char **)pachData, sizeof(pachData)/sizeof(pachData[0][0]));
return 0;
}