1、函数调用时传送给形参表的实参必须与形参三个一致
类型, 个数,顺序
2、参数传递的两种方式
(1)传值方式(参数为整型,实型,字符型等)
(2)传地址:参数为指针变量, 参数为引用类型,参数为数组名
例子:传值方式
把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。
函数修改的是副本的值,实参的值不变。
#include<iostream.h>
void swap(float m, float n)
{
float temp;
temp = m;
m = n;
n = temp;
}
void main()
{
float a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<endl<<b<<endl; //a和b的值不变
}
例子:传地址方式 ——指针变量做参数
形参变化影响实参:
#include<iostream.h>
void swap(float *m, float *n)
{
float temp; //*m 为指向空间的值a,*n为指向空间的值b
temp = *m; //*m == a, temp == a;
*m = *n; //*n == b, *m == b;即m=&b
*n = temp; //temp == a, *n==a;即n=&a
} /*调换了空间内的值*/
void main()
{
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a; p2=&b;
swap(p1,p2);
cout<<a<<endl<<b<<endl; //a和b的值改变
}
形参变化不影响实参
#include<iostream.h>
void swap(float *m, float *n)
{
float *temp;
temp = m; //m==&a, temp == &a
m = n; //n==&b, m == &b
n = temp; //temp == &a, n == &a;
} /*最后swap的结果,只是改变了m,n指向的空间,即只是改变了p1,p2指向的空间*/
void main()
{
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a; p2=&b;
swap(p1,p2);
cout<<a<<endl<<b<<endl; //a和b的值不改变
}
例子:传地址方式——数组名做参数
1、传递的是数组的首地址
2、对形参数组所做的任何改变都将放反映到实参数组中
#include<iostream.h>
void sub(char b[]){ //b[],储存a的首地址的数组,数组不能指定大小
b[] = "world";
}
void main(void){
char a[10] = "hello";
sub(a); //a指,数组首元素的地址???
cout<<a<<endl; //输出结果:world
}
用数组做函数的参数,求10个整数的最大数
#include<iostream>
#define N 10
int max(int a[]);
void main(){
int a[10];
int i,m;
for(i=0,i<N,i++)
cin >> a[i];
m=max(a);
cout << "the max number is :"<< m;
}
int max(int b[]){
int i,n;
n=b[0];
for(i=1;i<N;i++)
if(n<b[i]) n=b[i]; //找寻最大值,并把较大值存储在n中
return n;
}
/*
结果:
1 2 3 4 5 6 7 8 9 0
the max number is :9
*/
传地址方式——引用类型作参数
引用: 它是用来给一个对象提供一个替代名字
#include<iostream.h>
void main(){
int i=5;
int &j=i; //j是一个引用类型,代表i的一个替代名,i值改变时,j值也跟着改变,所以会输出i=7,j=7
i=7;
cout << "i=" << i << "j=" << j;
}
例子:
#include<iostream.h>
void swap(float &m, float &n) //应用类型作参数:m对a的空间的引用,a,m时同一块空间
{
float temp;
temp = m;
m = n;
n = temp;
}
void main()
{
float a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<endl<<b<<endl; //a和b的值改变
}
总结
引用类型作参数的三点说明
(1)传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化
(2)引用类型作形参,在内存中并没有产生实参的副本,它直接对实参进行操作; 而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。 (3)指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在《《主调函数的的调用点》》处,必须用变量的地址作为实参。