1)问题:二级指针到底是什么?怎么用的?怎么存放的?
1 #include <stdio.h> 2 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 ",a); 13 printf("0x%p, 0x%p ",&a, pA); 14 printf("0x%p, 0x%p ",&pA, ppA); 15 printf("0x%p ",&ppA); 16 17 printf("[0x%p]:0x%p 0x%p 0x%p 0x%p ",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 ",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 ",TEST_ADDR+0x20, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3)); 22 }
结果如下:
0x5555AAAA 0x0012FF60, 0x0012FF60 0x0012FF54, 0x0012FF54 0x0012FF48 [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 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define STR "Hello! " 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调用操作函数,而在操作函数中用二级指针进行操作;