c++中的参数传递(值传递和引用传递)

来源:互联网 发布:冰川网络 高祥 编辑:程序博客网 时间:2024/05/19 17:07

一 c++中参数传递的类型

    参数传递只有两种类型:值传递(指针传递也属于这种)和引用传递。

    在此先说明一下,声明并初始化一个变量在内存中的过程。

    如下代码:int   a=65;

    程序执行这一句时,内存为变量a开辟一个4字节(假定整型占4个字节)的空间,这个位置存放的值为65,这变量的名称为a(取名是为了方便记忆和操作,该名称和存放的位置是关联在一起的)。我们知道字符'A'的asc码也为65,那在使用这个值的时候,编译系统如何知道这个65代表的是字符'A'还是整数65呢?这很简单,因为我们定义a时指定的a数据类型为int,程序会根据变量的类型来决定如何使用它。至此,我们头脑中应该清楚一个变量应该具有4个要素:

  1.     数据类型。无论是整型,字符型,结构体,共用体,还是对象在内存中都是以0和1的形式存在的,这时编译系统就需要根据数据类型来决定如何使用它,
  2.     变量名。即内存中某个位置的标识或者引用。
  3.     变量地址。即变量在内存中存放的地址或者位置。
  4.     变量的值。


为了说请不同类型参数传递的区别,以下是试图交换变量a和b的3个函数。

void swap1(int a, int b){int temp;temp=a;a=b;b=temp;}void swap2(int *a, int *b){int temp;temp=*a;*a=*b;*b=temp;}void swap3(int &a, int &b){int temp;temp=a;a=b;b=temp;}void main( ){        int i=1, j=2;        swap1(i, j);//i,j没有交换        swap2(&i, &j);//i,j交换成功        swap3(i, j);//i,j交换成功}



二 值传递

    swap1和swap2都是值传递。执行swap1时,内存中会另外开辟两个空间用来存放形参a和b,a和b的值分别是i和j的副本,显然函数swap1进行的操作是交换a和b的值,而丝毫没有影响到i和j。执行swap2时,内存同样会开辟两个空间来存放指针变量a和b,此时经参数传递后,a,b分别存放的是i和j的地址,即&i和&j的副本,依然是值传递,然后在函数中对a和b进行间接访问操作,实际上就是对变量i和j进行操作(我知道了i和j存放的地址,我就能真实的对它们进行操作,这就是指针),所以i和j的值交换成功。

三 引用传递

    何为引用,其实就是相当于一个别名,例如邓小平爷爷有个外号叫小钢炮,邓小平和小钢炮都是指的同一个人。当调用swap3时,其实就是分别给变量i和j取了a和b的别名,所以对a和b的所有操作都会映射到i和j上。与引用传递为了和值传递以示区别,在定义函数时需要在参数前面加上“&”,如swap3(int &a, int &b)。呵呵,其实就是这样简单。


原创粉丝点击