函数修改的是副本的值,实参的值不变
#include <iostream.h>
void swap(float m,float n)
{
float temp;
temp=m;
m=n;
n=temp;
}
int main()
{
float a,b;
cin>>a>>b;
swap(a,b);
cout<<"输出a="<<a<<endl<<"输出b="<<b<<endl;
return 0;
}
//结果如下
3
4
输出a=3
输出b=4
传地址方式——指针变量作为参数
形参变化影响实参
#include <iostream.h>
void swap(float *m,float *n)
{
float t;
t=*m;
*m=*n;
*n=t;
}
int main()
{
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a;p2=&b;
swap(p1,p2);
cout<<"输出a="<<a<<endl<<"输出b="<<b<<endl;
return 0;
}
//结果如下
3
4
输出a=4
输出b=3
形参变化不影响实参??
#include <iostream.h>
void swap(float *m,float *n)
{
float *t;
t=m;
m=n;
n=t;
}
int main()
{
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a;p2=&b;
swap(p1,p2);
cout<<"输出a="<<a<<endl<<"输出b="<<b<<endl;
return 0;
}
传地址方式——引用类型作为参数
引用:它用来给一个对象提供一个代替的名字
解释:j是一个引用类型,代表i的一个代替代名。i值改变时,j值也跟着改变,所以会输出。
#include <iostream.h>
int main()
{
int i=5;
int &j=i;
i=7;
cout<<"输出i="<<i<<endl<<"输出j="<<j<<endl;
return 0;
}
//结果
输出i=7
输出j=7
传地址方式——引用类型作参数
#include <iostream.h>
void swap(float &m,float &n)
{
float t;
t=m;
m=n;
n=t;
}
int main()
{
float a,b;
cin>>a>>b;
swap(a,b);
cout<<"输出a="<<a<<endl<<"输出b="<<b<<endl;
return 0;
}
//结果
3
4
输出a=4
输出b=3
引用类型作形参的三点说明
- 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。
- 引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一-般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。
- 指针参数虽然也能达到与使用引用的效果,但在被调函数中.需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一-方面,在主调函数的调用点处,必须用变量的地址作为实参。
传地址方式——数组名作参数
传递的是数组的首地址
对形参数组所做的任何改变都将反映到实参数组中
#include <iostream.h>
void sub(char);
void main (void)
{
char a[10]="hello";
sub(a);
cout<<a<<endl;
}
void sub(char b[])
{
b[]="world";
}
例子:用数组函数的参数,求10个整数的最大数
#include <iostream>
#define N 10
int max(int a[]);
int 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];
return n;
}