shuiyu 发表于 2018-1-17 12:26:58

《带你学C带你飞》第二十六讲:指向指针的指针

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

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

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


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

(2)实例讲解:

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

三、数组指针和二维数组
(1)实例:

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



谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:},不对的请各位大佬指教,谢谢{:10_254:}
页: [1]
查看完整版本: 《带你学C带你飞》第二十六讲:指向指针的指针