函数(二)

参数传递

目录

值传递

按地址传递

引用传递


参数传递的方式(三种):值传递、按地址传递、引用传递

一、值传递:

        值传递是最简单的参数传递方式,只把实参的值传递给形参,形参的变化不会影响实参,实参的值在函数调用后不会发生变化

例:

//值传递
#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;                                            //正确:被声明的变量是普通变量,其值可以被修改

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值