以代码为例,自定义swap函数,说明三种形式,对实参的交换结果
void swap(int a,int b);
#include <iostream>
using namespace std;
void swap(int p,int q)
{
int temp;
temp =p;
p =q;
q = temp;
}
int main()
{
int a=1,b=2;
swap(a,b);
cout<<"a="<<a<<" b="<<b<<endl;
return 0;
}
//输出结果:a=1 b=2
//并没有对实参,产生交换
void swap(int * p,int * q);//但是,使用int* temp
#include <iostream>
using namespace std;
void swap(int * p,int * q)
{
int* temp;
temp =p;
p =q;
q = temp;
}
int main()
{
int a=1,b=2;
int *p,*q;
p =&a;
q =&b;
swap(p,q);
cout<<*p<<*q<<endl;
return 0;
}
//输出结果:*p=1 *q=2
//并没有对实参,产生交换,因为
//调用函数,不会改变实参指针变量的值(就是不会改变实参指针指向的地址),
//但是可以改变实参指针变量所指向变量的值(指向地址不变,可以改变里面的值)
void swap(int * p,int * q);//使用 int temp
#include <iostream>
using namespace std;
void swap(int * p,int * q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
int main()
{
int a=1,b=2;
int *p=&a,*q=&b;
swap(p,q);
cout<<"*p="<<*p<<" *q="<<*q<<endl;
return 0;
}
//输出结果:*p=2 *q=1
//对实参的数值,交换成功
void swap(int &p,int &q);
#include <iostream>
using namespace std;
void swap(int &p,int &q)
{
int temp;
temp = p;
p = q;
q = temp;
}
int main()
{
int a=1,b=2;
//int *p=&a,*q=&b;
swap(a,b);
cout<<"a="<<a<<" b="<<b<<endl;
return 0;
}
//输出结果:a=2 b=1
//对实参的数值,交换成功
引用(&),&a,不是“a的地址”,而是指“a是一个整形变量的引用(别名)”由于是形参,所以不必对它进行初始化(未指定它是哪个变量的别名)
传值方式:void swap(int a,int b);
void swap(int * p,int * q);
(实参是地址,传递的也是地址,故仍然是传值方式)
传址方式:void swap(int &p,int &q);