鱼C论坛

 找回密码
 立即注册
查看: 2896|回复: 0

[技术交流] 《带你学C带你飞》第二十六讲:指向指针的指针

[复制链接]
发表于 2018-1-17 12:26:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2018-1-17 12:29 编辑

越努力,越幸运。欢迎大家来看我的笔记,不对的请各位大佬指正,谢谢

一、指向指针的指针
实例讲解,下面的代码中:
(1)p 定义的是指向整型的指针,也就是说指针变量 p 里边存放的是整型变量 num 的地址。所以,*p 就是对指针进行解引用,得到了 num 的值。
(2) pp 就是指向指针的指针,pp 存放的是指针变量 p 的地址。所以,对 pp 进行一层解引用(*pp)得到的是 p 的值(num 的地址)。
(3)对 pp 进行两层解引用(**pp)相当于对 p 进行一层解引用(*p),得到整型变量 num 的值。
1.PNG

二、指针数组和指向指针的指针
(1)使用指向指针的指针来指向数组指针,至少有两个优势
1.避免重复分配内存(虽然我们进行了多个分类,但每本书的书名只占据一个存储位置,没有浪费)
2.只需要进行一处修改(如果其中一个书名需要修改,我们只需要修改一个地方即可)。这样,代码的灵活性和安全性都有了显著地提高。

(2)实例讲解:
2.PNG
1.首先定义的是指针数组"array"(里面装的都是指针),然后定义指向指针的指针"str1";使str1=&array[5];意思是:因为"str1"存放的是地址(不理解?就拿*p这个指针套,*p是一个指针,那么p就是地址咯),使"str1"存放array[5]的地址,对"str1"进行一层解引用(*str1)得到的是"array[5]"的值(num 的地址),也就是"fffff...."啦~
2.我们定义了一个指向指针的指针"**str2[6]"(个人理解为指向指针数组的指针,原理一样);把每个指针数组中的元素的地址赋值给"str2",对"str1[ i ]"进行一层解引用(*str1[ i ])得到的是"array[ i ]"的值。

三、数组指针和二维数组
(1)实例
3.PNG
(2)分析
1. p 是一个指向数组的指针,这个数组包含了 4 个元素,所以  p的跨度是 4 * sizeof(int),然后把二维数组第一个元素的地址赋值给 p。这时,p+1 恰好是二维数组一行的跨度。对 p+1 进行解引用,得到的就是二维数组第二行第一个元素的首地址。所以我们可以通过数组指针的方式来访问二维数组。
2.如果定义的是**p,也是把二维数组第一个元素的地址赋值给 p,但是在输出时使用"*(*(p+i)+j)",系统不知道我们想要的跨度是4 * sizeof(int),而是当做一个普通的地址加发跨度为sizeof(int),所以就会输出错误。



谢谢小甲鱼带来的视频教程,感谢!!

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记,不对的请各位大佬指教,谢谢

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 10:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表