形参与实参
“形参”即“形式参数”的简称,在函数没有被调用的时候,“形参”是没有实际的值的。“实参”即“实际参数”的简称,在函数被调用时,由函数调用方传递实际的值给函数内部使用。
返回值类型 function(参数类型 形参) {
操作形参;
}
main() {
参数类型 实参;
function(形参=实参);
}
函数内部操作的形参和外部传递的实参是两个各自独立的类型相同、内容相同的变量。用这一句话去理解前面说的三种参数传递方式,就是:
【按值传递】:即“参数类型”是基本数据类型(非指针&非引用),那么函数内部的形参只是用外部的实参赋了一下值,在函数内部操作形参变量,对外部的实参变量肯定没有任何影响。
【按地址传递】:即“参数类型”是指针类型,那么函数内部的形参也是用函数外部的实参赋了一下值,但是因为指针本身的特性——指针内部存储的是另外一个变量的地址,也就是说,函数内部的形参和外部的实参两个指针指向的是同一块内存,那么在函数内部通过形参指针操作指针指向的内容,也就是操作了外部实参指针指向的那块内容。
【按引用传递】:即“参数类型”是引用类型,那么函数内部的形参还是用函数外部的实参赋了一下值,但是因为引用本身的特性——引用就是变量的别名,那么函数内部的形参其实就是外部实参的一个别名,这个时候在函数内部操作形参,其实就是在操作函数外部的实参了。
tips:
- 在函数被调用时才分配形参的内存单元;
- 实参可以是常量、变量或者表达式;
- 实参类型必须与形参相符——如果不符合,编译时会试图进行隐含的类型转换,转换不了的话就报错咯;
- 值传递是传递参数值,即单向传递;
- 引用传递可以实现双向传递;
- 常引用变量做参数可以保障实参数据的安全(当你希望只传引用以节省开销而又不希望发生双向传递时可以这样试试);
值传递与引用传递一点细节
引用类型:
引用(&)是标识符的别名,定义引用时必须初始化,使它指向一个已经存在的对象;一旦一个引用被初始化,就不能改为指向其他对象的引用了;引用可以作为形参;
//举例
int i , j;
int & ri = i;
//定义一个int引用ri,并且初始化为i的引用;
j = 10
ri = j;
//此时这里相当于 i = j;
//最最最简单的swap却是理解神器
void swap (int &a , int &b ){
//此处形参列表如果是(int a ,int b)就无法真正交换
int t = a;
a = b;
b = t;
}