【C】二級指針探祕 & 星號的兩種用法(1.與基本類型結合造成另外一種類型,好比與int結合造成int* 2.取值操做)

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調用操做函數,而在操做函數中用二級指針進行操做;

相關文章
相關標籤/搜索