C++参数传递
以交换两个变量的值swap为例。
1.传值调用
函数定义: void swap(int x, int y)
调用方式: swap(a, b)
变量在定义时,内存中会为其分配一个存储地址,根据该变量类型不同,为其分配的内存大小不同,该地址为此块连续地址的首地址。在程序结束时,内存释放。
比如定义int a,b;,内存分配地址28000存储变量a的值,28004存储变量b的值,那么这两个变量就分别与这两个存储地址绑定了。给变量赋值a=1,b = 2,是把整数1和整数2存储进相应的地址对应的位置,取a则表示取28000地址处存储的值,此处值可能发生变化,但是a与28000的绑定不变。
函数定义表示swap函数的参数是两个整型值,进行swap(a,b)调用时,变量a和变量b复制值传递给swap的变量x和y(系统也分别为x和y分配了内存),然后再swap函数内部,x和y做交换重新赋值,与a和b无关。
2.指针调用
函数定义:void swap(int* x, int *y)
调用方式:swap(&a, &b)
指针变量,本质还是一个变量,定义int* p,系统为变量p绑定一个地址,比如38000,那么在这个内存位置存储着变量p的值,是一个地址,在这个地址处,存储着一个整型变量。取p,表示变量p绑定的地址处存储的地址值,取*p,表示变量p的值地址处存储的整型值。swap定义int* x和int* y,其参数是指针变量,存储地址,用*取该地址处的值。那么swap(&a,&b)调用发生时(&a为取变量地址),a和b绑定的变量地址赋值给swap的参数两个指针变量,那么x=28000,y=28004,操作*x和*y就是直接操作28000和28004内的存储值,a和b绑定在其上,就是操作a和b。
3.引用调用
函数定义:void swap(int& x,int& y)
调用方式:swap(a, b)
先看swap的参数是什么。变量自身总是独立存在的,不管是x,*x,&x,都是x作为变量,对其有各种用法。swap的参数变量x,能进行&x操作,说明他存储的是普通数据。(不管定义形式如何,swap的参数始终都是x和y,在指针调用中,参数x和y内存地址,所以用&a和&b来赋值)那么swap的参数就是普通变量,但是函数调用并非传变量值,二是将a的地址赋给x的地址,将b的地址赋给y的地址,那么相当于将x和y分别绑在了28000和28004上,那么a和x,b和y操作的就是同一地址内的内容。

浙公网安备 33010602011771号