参数传递
目录
参数传递的方式(三种):值传递、按地址传递、引用传递
一、值传递:
值传递是最简单的参数传递方式,只把实参的值传递给形参,形参的变化不会影响实参,实参的值在函数调用后不会发生变化
例:
//值传递
#include<iostream>
using namespace std;
void swap(int x, int y)
{
int temp;
temp = x; x = y; y = temp; //交换形参x,y的值
}
int main()
{
int a = 20, b = 40;
cout << "before swap:" << "a=" << a <<" " << "b=" << b << endl; //函数调用前输出a和b
swap(a, b);
cout<< "after swap:" << "a=" << a <<" " << "b=" << b << endl; //函数调后前输出a和b
return 0;
}
运结果:
二、 按地址传递:
函数定义时以指针作为函数的形参,函数调用的实参必须是指针变量或变量的地址。
修改值传递中所举的例子,以指针作为函数参数
//按地址传递,以指针作为函数参数
#include<iostream>
using namespace std;
void swap(int*px, int*py) //指针作为函数形参
{
int temp;
temp = *px; //*px作为px所知单元的内容
*px = *py;
*py = temp;
}
int main()
{
int a = 20, b = 40;
cout << "before swap" << "a=" << a << ",b=" << b << endl;
swap(&a, &b); //地址作为函数实参
cout <<"after swap" << "a=" << a << ",b=" << b << endl;
return 0;
}
运行结果:
特例 采用数组作为函数参数属于按地址传递方式
以指数组或数组指针作为函数的形参,数组名或数组首元素的地址作为函数调用的实参。这种参数传递的实质是形参和实参共用内存中的同一个数组
//利用数组作为函数参数,求n个同学某门课的平均成绩
#include<iostream>
using namespace std;
float average(float array[], int n)
{
float aver, sum = 0;
for (int i = 0; i < n; i++)
sum = sum + array[i];
aver = sum / n;
return aver;
}
void main()
{
float score1[5] = { 88,95,75,80,65 };
float score2[10] = { 88,95,75,80,65,90,85,70,60,78 };
cout << "the average of score1 is:" << average(score1, 5) << endl;//数组名作为实参
cout << "the average of score2 is:" << average(&score2[0], 10) << endl;//数组首元素地址作为实参
}
运行结果:
三、引用传递
引用
在介绍引用传递之前首先介绍引用的概念
引用(reference)是C++中独具特色的一个概念。
引用是一种特殊类型的变量,它是另一个变量的别名。声明一个引用时需要在其名称前加符号&,并同时对引用进行初始化,即指定它所引用的对象(是哪一个变量的别名)
语法形式:
<数据类型> &<引用名>=<变量名>;
例如:
int Actualint; //声明变量ActuInt
int &OtherInt=Actualnt //声明变量ActuaInt的引用OtherInt
一旦为一个变量声明一个引用,那么对这个引用的所有操作实际上都是对被引用变量的操作,反过来也是如此,他们代表同一个变量并且占用相同的内存单元。
例:
//为变量i声明一个引用r,在程序中分别对r和i进行运算,可以看到,当r变化时i也随之变化,反之亦然
#include<iostream>
using namespace std;
void main()
{
int i = 10;
int& r = i;
r++;
cout << "i=" << i << ",r=" << r << endl;
i = 88;
cout << "i=" << i << ",r=" << r << endl;
}
运行结果:
引用作为一般变量使用几乎没什么实际意义,其最大用处是用作函数形参。
引用传递
引用传递与按地址传递在功能上很像,可以通过在被调函数中改变形参来改变主调函数中的实参,但引用传递比按地址传递更简捷直观也更好理解。
采用引用传递方式,只需要在函数定义时使用引用作为形参,在函数调用时直接使用一般变量作为实参即可。
例:
#include <iostream>
using namespace std;
void swap(int&, int&); //函数声明
void main()
{
int a = 20, b = 40;
swap(a, b);
cout << "a=" << a << ",b=" << b << endl;
}
void swap(int&x, int&y) //引用作为函数形参
{
int temp = x;
x = y;
y = temp;
}
运行结果:
引用传递的优势:
使用引用传递参数并没有在内存中产生实参的副本,不需要将实参复制给形参,在空间和时间上的效率都比较高;
引用传递的不足:
使用引用作为函数参数不能保证参数在函数中不被修改,降低了数据的安全性。
为解决以上引用传递的不足,可以使用常引用
常引用的声明方式:
const <数据类型> &<引用名>=<变量名>
常引用的值不能被修改,而原来的变量可以被修改
int a=0;
const int &ra=a; //声明一个常引用
ra=1; //错误:不能修改常引用
a=1; //正确:被声明的变量是普通变量,其值可以被修改