首先你肯定明白一个道理:当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会涌向初始值
传值参数的机理完全一样,由于每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化,所以函数对形参做的所有操作不会影响实参,如果我们想让函数改变我们传入的实参本身们就可以用到指针形参访问函数外部对象
先看一段代码:
当执行指针拷贝操作时,拷贝的是指针的值(地址),拷贝之后,两个指针是不同的指针,因为指针可以使我们间接地访问所指向的对象,所以通过指针可以修改对象的值
指针形参也差不都
调用这个reset函数之后,实参所指向的对象被置为0,但是实参本身并没有改变,输出如下
我们知道对于引用的操作实际上是作用在所引用的对象上的:
引用形参与之类似,通过引用形参,允许函数改变实参的值
当调用这一版本的reset时,直接传入对象而无须传递地址,被改变的对象是传入reset的实参
输出:
举个例子,我们准备编写一个函数比较两个string对象的长度,对象可能会非常长,所以应该尽量避免直接拷贝它们,这时候引用形参就可以避免拷贝
因为无需改变对象内容,所以把形参定义为对常量的引用
先简单回顾下const
关于const的详解:https://www.cnblogs.com/zhxmdefj/p/11524403.html
一样,形参初始化时会忽略掉顶层const
但因此也要注意一个问题
因为顶层const被忽略掉了,所以上面两个fucn的参数可以完全一样,因此第二个fucn会报错

形参初始化方式和变量初始化方式是一样的,先回顾下初始化规则:
将同样的规则应用到参数传递:
把函数不会改变的形参定义成普通引用,往往会给函数调用者一误导:函数可以修改它实参的值
同时还会极大地限制函数所能接受的实参类型(比如上面的reset不能接受const)
数组的两个特性:1.不允许拷贝数组 2.使用数组时会将其转换为指针
因此,我们不能以值传递的方式使用数组,并且传递数组时,实际上传递的是指向首元素的指针
上面三个函数是等价的,每个函数的唯一形参都是const int*类型
使用标记指定数组长度
(C风格字符串存储在字符数组,最后一个字符后面跟着一个空字符)
这种方法适用于有明显结束标记的情况
使用标准库规范
传递指向数组首元素和尾后元素的指针
显示传递一个表示数组大小的实参
C程序和古老的C++程序员常常使用这种技法
C++允许将变量定义成数组的引用,所以形参也可以是数组的引用
注意(&arr)两端括号必不可少
多维数组其实就是数组的数组,所以首元素本身就是一个数组,阵阵就是一个指向数组的指针
(*martrix)两端括号必不可少