博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)...
阅读量:6644 次
发布时间:2019-06-25

本文共 2714 字,大约阅读时间需要 9 分钟。

1)问题:二级指针到底是什么?怎么用的?怎么存放的?

1 #include 
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 }

结果如下:

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

转载于:https://www.cnblogs.com/caixu/p/3451778.html

你可能感兴趣的文章
[AH2017/HNOI2017]礼物【FFT】
查看>>
实景三维系列1 | 倾斜摄影发展历程
查看>>
从零开始开发一个简易的类vue-cli构建工具
查看>>
Microsoft Office Excel 不能访问文件“*.xls”。
查看>>
mongodb 使用 robo3T 等工具添加用户之后还是 auth failed 的问题
查看>>
[AGC014D]Black and White Tree
查看>>
陶哲轩实分析习题9.7.2 不动点定理的最简单情形
查看>>
$\sin x_0+\frac{\cos x_0}{1!}(x-x_0)+\cdots +\frac{\sin (x_0+n\frac{\pi}{2})}{n!}(x-x_0)^n+\cdots$
查看>>
C# 获取本机IP地址
查看>>
Debian 7 安装使用 Virtualbox及增强功能
查看>>
ubuntu下脚本基础
查看>>
遍历XML文件添加到TreeView递归调用
查看>>
System.InvalidOperationException: 找到多个与名为“Home”的控制器匹配的类型。
查看>>
web爬虫,requests请求
查看>>
标签的类添加与删除
查看>>
Unity3D 4.3在Windows下打包iOS资源
查看>>
unity编程心得
查看>>
第十篇 javascript基础语法
查看>>
【洛谷团队题目】
查看>>
虚拟机Ubuntu16.04 Server设置NAT方式修改ip
查看>>