50分 C语言比较两个数的大小,调用这几种函数分别有什么不同,希望给详细解释一下

第一种:swap(int& x,int& y)
{
int temp;
temp = x;
x = y;
y = temp;
}
第二种:swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
第三种:swap(int *x,int *y)
{
int temp;
temp = *x;
*x=*y;
*y=temp;
}实在搞不懂,看了很多讲解,希望有大神能够讲的细致明白

        这三个函数实现的功能是交换两个数,但实际只有第一和第三种可以成功交换原来的传进来的实参,第二种交换的是形参的值,并不会改变实参的值
        首先,要知道一点,函数调用的实质都是实参按值传递给形参,所以第一、二种函数接受的实参都是 int 类型两个数据,此处假设分别是 a 和 b ,而第三种函数接受的实参是一个 int 类型数据的地址,即为 &a 和 &b (此处的 & 表现为 “ 取地址符 ” ,在 C 语言中 & 具有多种功能,比如后面表现出来的 “ 引用符号” 的作用,这称作运算符的重载 )。

        那么开始分析函数:

        第一种,形参为 int & x 和 int & y(此处的 & 表现为 “ 引用符号 ” )

        执行的操作为 

        int & x = a ;
        int & y = b ;

        其中 x 和 y 分别是 a 和 b 的引用, 如果我们把变量名理解为一段内存空间的标识符,那么引用可以理解对一段内存空间的另一个标识符,也就是说同一段内存空间可以用多个名字来标志。因为 x 和 a 表示的是同一内存空间的标识符,所以修改 x 所代表的内存空间的值就相当于修改 a 所代表的内存空间的值,y 与 b 的关系同理。

        

        第二种,形参为 int x 和 int y

        执行的操作为

        int x = a ;
        int y = b ;

        其中 x 和 y 都是局部变量,x 和 y 所代表的内存空间与 a 和 b 所代表的内存空间不同,这里把 a 和 b 所代表的内存空间的值通过赋值操作分别拷贝了一份,送给了 x 和 y所代表的内存空间,即 x 和 y 所代表的内存空间的值分别与 a 和 b 所代表的内存空间的值是相同的,但它们所代表的内存空间是不一样的,即内存空间的地址不同。所以交换 x 和 y 的内存空间的值并不会影响 a 和 b 的内存空间的值。


        第三种,形参为 int * x 和 int * y

        执行的操作为

        int * x = &a ;
        int * y = &b ;

        其中 x 和 y 分别是指向了 a 和 b 的内存空间的指针,x 和 y 也是局部变量,所以跟第二种函数一样,他们与 a 和 b 的内存空间也是不一样的,但是不同点在于,x 和 y 的内存空间里所存储的值是 a 和 b 的地址。所以通过 *x 和 *y 来访问 a 和 b 空间里值,这里的 * 表示是 “ 间接访问符 ”(与 & 一样,也是 * 的一种重载),它的功能是把 x 和 y 空间中的值(a 和 b 的内存空间的地址)当作地址找到 a 和 b 的内存空间,因此 *x 与 a 是等价的,*y 与 b 是等价的。所以交换 *x 和 *y 的值 就是交换 a 和 b 的值。

        最后,总结一下,第一种引用交换和第三种指针交换的区别在于,指针需要另外开辟新的空间来储存地址,而引用并不需要额外的空间。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-28
设a=1,b=2设swap(a,b)
第一个的意思是&x=a,&y=b;传引用此时x,y是a,b的“小名”就相当于a,b即对x的操作就相当于对ab的;
第二个相当于swap(a,b)=swap(1,2),调用一下swap(1,2)a,b的值肯定不变;
第三个指针调用函数差不多相当于int *x=a,int *y=b;即给a,b分别建立了一个指针,此时函数里面
*x就等于a,*y=b所以...