1、参数传递:值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;指针传递:传递的是一个外部实参的地址,当被调用函数的形参发生变化时,实参也会变化;引用传递:实参和形参通过引用绑定;形参的任何改动都会直接影响到实参;【注】:当某种类型不支持拷贝操作时,或拷贝大的类类型对象时比较低效,函数只能通过引用形参访问该类型的对象;【注】:如果函数无须改变引用形参的值,最好将其声明为常量引用;
2、示例:对两个整数进行交换;代码如下:#include "stdafx.h"#include <iostream>using namespace std;//值传递void swap1(int p,int q){ int temp; temp=p; p=q; q=temp;}//指针传递,函数体内只有指针值的变化void swap2(int *p,int *q){ int temp; temp=*p; *p=*q; *q=temp;}//指针传递,函数体内只有指针的变化void swap3(int *p,int *q){ int *temp; temp=p; p=q; q=temp;}//引用传递void swap4(int &p,int &q){ int temp; temp=p; p=q; q=temp;}int main(){ int a=1,b=2; cout<<"before swap ..."<<endl; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; swap1(a,b); //swap2(&a,&b); //swap3(&a,&b); //swap4(a,b); cout<<"after swap ..."<<endl; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; system("pause"); return 0;}
3、值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;//值传递void swap1(int p,int q){ int temp; temp=p; p=q; q=temp;}int main(){ int a=1,b=2; cout<<"before swap ..."<<endl; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"a 的地址= "<<&a<<endl; cout<<"b 的地址= "<<&b<<endl; swap1(a,b); //swap2(&a,&b); //swap3(&a,&b); //swap4(a,b); cout<<"after swap ..."<<endl; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"a 的地址= "<<&a<<endl; cout<<"b 的地址= "<<&b<<endl; system("pause"); return 0;}
4、指针传递一:swap2()swap2和swap3都是指针传递,swap2函数体内交换了p和q指向地址的值;//指针传递,函数体内只有指针值的变化void swap2(int *p,int *q){ int temp; temp=*p; *p=*q; *q=temp;}int a=1,b=2;swap2(&a,&b);//指针传递解释:实参a的值为1,a的地址为CE4;实参b的值为2,b的地址为D04;指针传递过程中传递的是a,b的地址;形参p是指向a地址CE4的指针,p的地址为CE0;形参q是指向b地址D04的指针,q的地址为CE8;此时,解引用指针*p的值为1;解引用指针*q的值为2;故swap2函数体内交换了p和q指向地址的值;
5、指针传递二:swap3()swap3函数体内交换了p和q指向的地址//指针传递,函数体内只有指针的变姝耒匝揎化void swap3(int *p,int *q){ cout<<"before swap ..."<<endl; cout<<"p 的地址= "<<&p<<endl; cout<<"q 的地址= "<<&q<<endl; cout<<"*p = "<<*p<<endl; cout<<"*q = "<<*q<<endl; int *temp; temp=p; p=q; q=temp; cout<<"after swap ..."<<endl; cout<<"p 的地址= "<<&p<<endl; cout<<"q 的地址= "<<&q<<endl; cout<<"*p = "<<*p<<endl; cout<<"*q = "<<*q<<endl;}//调用int a=1,b=2;swap3(&a,&b);//指针传递解释:实参a的值为1,a的地址为8C4;实参b的值为2,b的地址为8E4;指针传递过程中传递的是a,b的地址;形参p是指向a地址8C4的指针,*p值为1;形参q是指向b地址8E4的指针,*q值为2;此时对指针p,q的值即8C4,8E4进行交换,交换之后,形参p是指向a地址8E4的指针,*p值为2;形参q是指向b地址8C4的指针,*q值为1;但a和b地址中的值并未发生变化,故a和b不变;故swap3函数体内交换了p和q指向的地址;
6、引用传递:实耩撞苏粪参和形参通过引用绑定;形参的任何改动都会直接影响到实参;//引用传递void swap4(int &p,int &q){ cout<媪青怍牙<"before swap ..."<<endl; cout<<"p = "<<p<<endl; cout<<"q = "<<q<<endl; cout<<"p = "<<&p<<endl; cout<<"q = "<<&q<<endl; int temp; temp=p; p=q; q=temp; cout<<"after swap ..."<<endl; cout<<"p = "<<p<<endl; cout<<"q = "<<q<<endl; cout<<"p = "<<&p<<endl; cout<<"q = "<<&q<<endl;}//函数调用int a=1,b=2;swap3(a,b);//指针传递解释:实参a的值为1,a的地址为744;实参b的值为2,b的地址为764;引用传递:将实参和形参绑定在一起;形参p的值为1,p的地址为744;形参q的值为2,q的地址为764;交换后,形参p的值为2,p的地址为744;形参q的值为1,q的地址为764;实参a的值为2,a的地址为744;实参b的值为1,b的地址为764;故swap4引用传递等同于对实参的操作,即传递的不是实参的副本,而就是实参;