1)问题:二级指针到底是什么?怎么用的?怎么存放的?
1 #include2 3 #define TEST_ADDR 0x12FF40 4 5 void main() 6 { 7 int a = 0x5555AAAA; 8 int* pA = &a; 9 int** ppA = NULL;10 unsigned int * pAddr = (unsigned int *)TEST_ADDR;11 ppA = &pA;12 printf("0x%p\n",a);13 printf("0x%p, 0x%p\n",&a, pA);14 printf("0x%p, 0x%p\n",&pA, ppA);15 printf("0x%p\n",&ppA);16 17 printf("[0x%p]:0x%p 0x%p 0x%p 0x%p\n",TEST_ADDR, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));18 pAddr = (unsigned int *)(TEST_ADDR+0x10);19 printf("[0x%p]:0x%p 0x%p 0x%p 0x%p\n",TEST_ADDR+0x10, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));20 pAddr = (unsigned int *)(TEST_ADDR+0x20);21 printf("[0x%p]:0x%p 0x%p 0x%p 0x%p\n",TEST_ADDR+0x20, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));22 }
结果如下:
0x5555AAAA0x0012FF60, 0x0012FF600x0012FF54, 0x0012FF540x0012FF48[0x0012FF40]:0xCCCCCCCC 0xCCCCCCCC 0x0012FF54 0xCCCCCCCC[0x0012FF50]:0xCCCCCCCC 0x0012FF60 0xCCCCCCCC 0xCCCCCCCC[0x0012FF60]:0x5555AAAA 0xCCCCCCCC 0x0012FFB8 0x00411B36请按任意键继续. . .
结果怎么看:
0x0012FF48存放的值是0x0012FF54 -> ppA = &pA;
0x0012FF54存放的值是0x0012FF60 -> pA = &a;
0x0012FF60存放的值是0x5555AAAA -> int a = 0x5555AAAA;
分析:
a.二级指针的用法:正确用法ppA = &pA; (若用*ppA = pA; 编译无错,运行出错)
记忆:ppA = &pA这是在搞定指向;而*ppA只 用于取值/赋值
(这种用法也是错的int** ppA = &&a;)
(这种用法也是错的int** ppA = pA;)
b.另一种正确用法:
int** ppA = &pA;
这种用法类比于pA = &a,只不过此时pA指向的是一个int,而ppA指向的是一个指针;此时的**可以理解为与int结合跟精密,是一种类型的一部分,因为ppA的类型为int**
c.二级指针是指向指针的指针;(这句只含一层意思:二级指针也是指针,没什么特殊的,要用得先指向,再取值/赋值)
总结:
形成习惯:定义二级指针的时候先赋值NULL;如果要用,先指向,再进行取值赋值操作;
2)实例——高级些的hello word!
1 #include2 #include 3 #include 4 5 #define STR "Hello!\r\n" 6 #define STR_MAX 10 7 8 extern int mallocStr(char** pStr, unsigned int len); 9 extern int test(char* pStr);10 extern void freeStr(char* pStr);11 12 int main()13 {14 char* pStr = NULL;15 16 if(0 != mallocStr(&pStr, STR_MAX))17 {18 return -1;19 }20 memset(pStr, 0 , STR_MAX);21 test(pStr);22 freeStr(pStr);23 return 0;24 }25 26 int mallocStr(char** ppStr, unsigned int len)27 {28 char* pMem = NULL;29 pMem = (char*)malloc(len);30 if (NULL == pMem)31 {32 return -1;33 }34 35 *ppStr = pMem;36 return 0;37 }38 39 int test(char* pStr)40 {41 strncpy(pStr, STR, STR_MAX);42 43 printf("%s", pStr);44 return 0;45 }46 47 void freeStr(char* pStr)48 {49 free(pStr);50 pStr = NULL;51 }
点评:
i.在第14行不建议使用二级指针,因为二级指针需要一级指针作媒介来指向实际内存;若此处使用二级指针,此题几乎无解;
ii.二级指针通常是作返回值用,通常用法是:调用函数定义一级指针,接着用&p调用操作函数,而在操作函数中用二级指针进行操作;