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 (&指针名)[第二维长度]

但是 引用数组是不存在的, 因为引用必须 有一个明确的捆绑目标。

若想更透彻的 理解 引用与指针,可以看我的 引用能否代替指针 的解释:

链接会后补上。

猜你喜欢

转载自blog.csdn.net/pursue_my_life/article/details/80355398
今日推荐