c++primer学习笔记--引用与指针的深刻理解与总结 及数组结合
用参数传递来 辨析 指针与引用的区别
在谭浩强错误的c程序设计中的最大错误就是: 传参有两种方式,传址和传值!!!!, 这句话我想说: 完全错,大错特错,错上加错,误人子弟。
指针也是一个变量,指针也值的 子集。所以谭浩强的说法完全错误, 为什么说只有一种呢, 指针在传参时,在函数的作用域内也只要产生一个副本 ——> 然后用这个副本指针指向 实际参数 ——> 然后就可以用实际参数的 地址 间接的 修改实际参数。
何为单向??
实际参数 ——> 形式参数 (这意味着只能通过 实际参数 直接修改 形式参数, 却不能通过 形式参数 直接修改 实际参数)
如果你要抬杠说, 副本指针 是 形式参数, 也可以修改指向的值啊。 那不好意思,你只是通过 副本参数 里的地址,去修改实际参数! 是 间接 的。
但是你就算 副本指针 死,死外面,瞎鸡巴指,从内存里跳出去, 最多也是你指向的地址发生变化, 实际参数不会发生任何改变。 但是你确实可以通过 副本指针 储存的地址去 间接的 修改实际参数。(但由于是间接的方式, 不能说可以双向传递)
So,
c语言的参数传递方式只有一种:
单向按值传递!!!
单向按值传递!!!
单向按值传递!!!
重要的事情说三遍。
c++语言的传递方式有两种:
1)继承自c的 单向按值传递。
2)双向引用传递
why? 为什么通过引用可以双向传递呢??
在参数传递中, 传递指针上面讨论过了,会产生副本指针, 可通过副本指针间接修改其指向的地址里面值。
传递引用呢? 不会产生副本指针, 是直接把实际参数的地址传递了过去, 对形式参数(在这里是引用)的任何修改, 都会处理成 * 的间接操作, 而直接改变其地址所存变量。 因为不是通过指针间接操作(通过指针间接访问太麻烦了,所以c++的设计者就改了), 而是直接对地址间接操作, 任何操作都能改变实际参数, 所以称为双向传递。
小结
引用与指针的本质区别: 指针是变量,能做左值, 引用不能。
数组名 和 指向数组首地址的指针
数组是一种数据结构,
数组名 就是数组的 首地址
指向数组的指针 就只是 一个指向位置特殊的指针而已
指针数组 和 指向指针的指针
指针数组这个名字不好听,
想象一下,在茫茫的内存中, 构建了一个数组。
这个数组的首地址 指向了一块内存, 数组名字也起好了, 叫 arry。
这个 数组的所有元素都为 指针类型
所以我们可以称 arry 这个数组的指针 为 指向指针的指针。
(但是 指针数组 绝对不是指向指针的指针, 因为数组不是不是指针!!!! 说数组本质是指针的全是放屁,数组元素也是 数组的一部分, 被他们吃了???)
每次提到 指针数组我还是得想老半天。
只需要记住 指针 用来 修饰 数组, 所以指针数组为数组。 指向这个数组的指针 为 指向指针的指针
若数组 用来 修饰指针, 数组指针 为 指针。
我们传递参数的时候不需要全部传递过去 int *样可以知道arry的首地址,就能间接对数组进行操作
指向指针的指针 与 二维数组的关系
回到我们的话题, 指向指针的指针
指针可以用来构建数组, 那么很简单
用 指针数组里的 每个指针构建了一个数组,此时 arry这个数组被称为 二维数组。
传递参数的时候只需要传递 int(*)[num](注意不是 int** ), 其中 num 为第二纬的长度。
那么这里我们就要提出一个新的概念辨析:
区分多级指针和多维数组
通过上面的做图我们可以看到,根本就没有多维数组,多维数组只是一维数组的模拟
上面我们提到了, int* 为指向 数组首地址的指针,
我们会 想当然的理解为 int**为指向二维数组首地址的指针。
But, This thought is absoluely mistake !!!
int** 为多级指针, int(*)[num] 才为指向多维数组的指针。
这怎么理解呢???
比如, 指向指针的指针arry ——> 指向了这个 指针数组
但是由于 指针数组 的每个元素都为指针,所以 无法确定这么多个指针指向的数组是什么长度的
如果你直接传给编译器一个 int**, 编译器直接懵逼然后会报给你一句 “Fuck U”。
所以只能传 int(*指针名)[3] 这样的形式告诉编译器,这是一个指向指针的指针。
注:我们要承认, 指向指针的指针本身就是 多(二)级指针。
多级指针的用处
比如,删除链表, 动态数组等等, 实践出真知
引用 与 指针
引用与指针的相差实在是太多了,这里不想多浪费笔墨。
数组 是 可以有引用的。 只谈参数的传递: 引用是实际参数的别名 ——> 所以传递 数组的引用 比 传 数组的指针 快
类型为 eg: int (&指针名)[第二维长度]
但是 引用数组是不存在的, 因为引用必须 有一个明确的捆绑目标。
若想更透彻的 理解 引用与指针,可以看我的 引用能否代替指针 的解释:
链接会后补上。