C语言中函数参数传递的三种方式(x,*x,&x)
#include<stdio.h> void myswap1(int x, int y) { int t; t=x; x=y; y=t; } void myswap2(int *p1, int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } void myswap3(int &x, int &y) { int t; t=x; x=y; y=t; } int main() { int a,b; a = 2; b = 3; myswap1(a,b); //作为对比,直接交换两个整数,显然不行 printf("调用交换函数后的结果是:%d 和 %d\n", a, b); a = 2; b = 3; myswap2(&a,&b); //交换两个整数的地址 printf("调用交换函数后的结果是:%d 和 %d\n", a, b); a = 2; b = 3; myswap3(a,b); //直接以变量a和b作为实参交换 printf("调用交换函数后的结果是:%d 和 %d\n", a, b); return 0; }
在第一个程序中,传值不成功的原因是指在形参上改变了数值,没有在实参上改变数值。
在第二个程序中,传地址成功的原因利用指针改变了原来的地址,所以实参就交换了。
在第三个程序中,引用是直接改变两个实参变量a,b的值,所以就交换了。
注:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;
【例】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。