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\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 }
結果以下:spa
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;code
0x0012FF54存放的值是0x0012FF60 -> pA = &a;blog
0x0012FF60存放的值是0x5555AAAA -> int a = 0x5555AAAA;內存
分析:string
a.二級指針的用法:正確用法ppA = &pA; (若用*ppA = pA; 編譯無錯,運行出錯)io
記憶:ppA = &pA這是在搞定指向;而*ppA只 用於取值/賦值 編譯
(這種用法也是錯的int** ppA = &&a;)class
(這種用法也是錯的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!\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調用操做函數,而在操做函數中用二級指針進行操做;