函数调用时传送形参表的实参必须与形参三个一致
类型、个数、顺序
参数传递有两种方式
- 传值方式(参数为整型、实型、字符型等)
- 传地址
- 参数为指针变量
- 参数为引用类型(重点)
- 参数为数组名
一、传值方式
- 把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。
程序如下:
#include<iostream>
using namespace std;
void swap(int m, int n)
{
int temp;
temp=m; m=n; n=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<endl<<b<<endl;
}
在swap函数中,将a,b分别赋值给m,n。虽然说m,n进行了值交换,但是a,b并没有进行交换,所以主函数输出时并未交换
输入a = 1,b = 2,输出仍为 a = 1, b = 2。
二、传地址方式
1. 指针变量作参数
第一种情况:形参变化影响实参
代码如下
#include<iostream>
using namespace std;
void swap(int *m, int *n)
{
int temp;
temp = *m;
*m = *n;
*n = temp;
}
int main()
{
int a,b,*p1,*p2;
cin>>a>>b;
p1 = &a; p2 = &b;
swap(p1,p2);
cout<<a<<endl<<b<<endl;
}
在该次中传递的是a,b的地址,在swap中,p1,p2分别表示指向a,b地址的地址,即*m,*n表示a,b的地址,是真正的实现了地址交换,所以主函数输出时实现了交换。
输入a = 1,b = 2,输出为 a = 2, b = 1。
第二种情况:形参变化不影响实参
代码如下:
#include<iostream>
using namespace std;
void swap(int *m, int *n)
{
int *temp;
temp = m; //此函数与上一代码有所差别,
m = n;
n = temp;
}
int main()
{
int a,b,*p1,*p2;
cin>>a>>b;
p1 = &a; p2 = &b;
swap(p1,p2);
cout<<a<<endl<<b<<endl;
}
.
2.引用类型作参数 (重点!!!!!!)
这里涉及到c++中一个语法:引用
引用:它是给一个对象提供一个替代的名字。
比如一个简单的例子:
#include<iostream>
using namespace std;
int main()
{
int i = 5;
int &j = i; //j引用i
i = 7;
cout<<"i="<<i<<"j="<<j;
}
j是一个引用类型,代表i的一个替代名。i的值改变时,j的值也会跟着改变,所以会输出 i=7 j=7。
引用类型作参数代码:
#include<iostream>
using namespace std;
void swap(int& m, int& n) //定义引用型的函数,
{ //对形参的操作相当于对实参的操作
int temp;
temp = m;
m = n;
n = temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<endl<<b<<endl;
}
在这个swap函数里,是直接对a,b操作,没有进行内存申请,提高了运行效率。
引用类型作参数的三点说明:
- 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化
- 引用类型作形参,在内存中并没有产生实参的副本(共用一个存储单元),它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好
- 指针参数虽然也能达到与使用引用的效果,但在被调用函数中需要使用 “*指针变量名” 的形式进行运算,容易出错,可阅读性差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
3.数组名作参数
- 传递的是数组的首地址
- 对形参数组所做的任何改变都将反映到实参数组中
代码如下:
#include<iostream>
using namespace std;
void sub(char b[])
{
b[]= "world";
}
int main()
{
char a[10] = "hello";
sub(a);
cout<<a<<endl;
}
例题:用数组作函数参数,求10个整数 的最大数
代码如下:
#include<iostream.h>
#define N 10
int max(int b[]);
void main()
{
int a[N];
int i,m;
for(i = 0; i < N; i ++)
cin>>a[i];
m = max(a);
cout<<"the max number is:"<<m;
}
int main(int b[])
{
int i,n;
n = b[0];
for(i = 1; i < N; i ++)
if(n<b[i])
n = b[i];
return n;
}