1:按值传递:
程序如下:
view plaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int a,int b)//指针保存地址
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"后: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(a,b);//取地址传递 变量的内存地址
cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int a,int b)//指针保存地址
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"后: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(a,b);//取地址传递变量的内存地址
cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;
return0;
}
输出的结果是:
主程序前: a:3 b:4
前: a:3 b:4
后: a:4 b:3
主程序前: a:3 b:4
主程序的值没有改变,改变的值是栈中的a 和b的副本的值,值传递的时候在栈中拷贝一个变量的副本来操作,这样的话就改变不了以前的值.用的时候要小心.
2:按址传递:
这个时候是用地址传递 程序如下:
viewplaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int *a,int *b)//指针保存地址
{
int c;
cout<<"前: a:"<<*a<<" b:"<<*b<<endl;
c=*a;
*a=*b;
*b=c;
cout<<"后: a:"<<*a<<" b:"<<*b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(&a,&b);//取地址传递 变量的内存地址
cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int *a,int *b)//指针保存地址
{
int c;
cout<<"前: a:"<<*a<<" b:"<<*b<<endl;
c=*a;
*a=*b;
*b=c;
cout<<"后: a:"<<*a<<" b:"<<*b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(&a,&b);//取地址传递变量的内存地址
cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;
return0;
}
这个就是按地址传递 在方法swap(&a,&b);的参数中&a,&b都是取地址 那么传递过去的地址由指针来接收所以在定义函数的时候有void swap(int *a,int *b)定义了俩个指针来存放地址,这样就好理解了 swap(){}函数里面的操作都是按指针来操作的*a ,*b
这样的话结果就是:
主程序前: a:3 b:4
前: a:3 b:4
后: a:4 b:3
主程序前: a:4 b:3
可以看到结果是改变了,因为直接操作的是a,b的内存地址
3:按别名(引用)传递:
viewplaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int &a,int&b)//接收俩个别名
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"后: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(a,b);//直接传递a b 传递过去的时候由别名接收那么就是自身的别名了
cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int &a,int &b)//接收俩个别名
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"后: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(a,b);//直接传递a b 传递过去的时候由别名接收 那么就是自身的别名了
cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;
return0;
}
这样的话接受的参数就是俩个别名,他们分别是主函数中a b的别名,因为别名和自身一样所以结果就改变了
主程序前: a:3 b:4
前: a:3 b:4
后: a:4 b:3
主程序前: a:4 b:3
可以看到用值传递一不小心就达不到目的了,用地址传递的话写法会比较困难,不小心会出错,用引用传递的话考虑的问题就没有那么多了,我们就可以放心的使用了,写函数的时候用引用,那么调用的时候就不用考虑太多了.