【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
",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调用操作函数,而在操作函数中用二级指针进行操作;

原文地址:https://www.cnblogs.com/caixu/p/3451778.html