关于函数实现数值交换

来源:互联网 发布:java中九九乘法表算法 编辑:程序博客网 时间:2024/06/05 20:11
#include <stdio.h>  void swap0(int a ,int b){  printf(" a addr : %d , b addr: %d\n", &a , &b);  int temp = a;  a = b;  b = temp;}int main()  {   int x=3 , y=5; printf(" x addr : %d , y addr: %d\n", &x , &y); printf(" x : %d , y : %d\n", x , y); swap0( x, y); printf(" x : %d , y : %d\n", x , y);return 0;}

运行结果:

 x addr : 1703740 , y addr: 1703736
 x : 3 , y : 5
 a addr : 1703652 , b addr: 1703656
 x : 3 , y : 5
Press any key to continue

表明:采用值调用方式无法交换实参的值,调用交换swap0导致实际参数x和y的值分别复制到形式参数a和b中,系统为形参a、b分配新的内存地址,故改变形参的值对实参无影响。在交换体内,a和b的值互换,函数终止。 终止后,a和b的新值不会被复制回实际参数。 因此,实际参数的值不受功能的影响。


#include <stdio.h>  void swap1(int *a , int *b)//使用指针方式修改指向内存块的值, 传值方式{  printf(" a addr : %d , b addr: %d\n", &a , &b);  printf(" a memory block addr : %p , b memory block addr: %p\n", a , b);  int temp = *a;  *a = *b;  *b = temp;  printf(" a addr : %d , b addr: %d\n", &a , &b);  printf(" a memory block addr : %p , b memory block addr: %p\n", a , b);}int main()  {   int x=3 , y=5; printf(" x addr : %d , y addr: %d\n", &x , &y); printf(" x memory block addr : %p , y memory block addr: %p\n", &x,&y); printf(" x : %d , y : %d\n", x , y); swap1( &x, &y); printf(" x : %d , y : %d\n", x , y); return 0;
}
运行结果:

 x addr : 1703740 , y addr: 1703736
 x memory block addr : 0019FF3C , y memory block addr: 0019FF38
 x : 3 , y : 5
 a addr : 1703652 , b addr: 1703656
 a memory block addr : 0019FF3C , b memory block addr: 0019FF38
 a addr : 1703652 , b addr: 1703656
 a memory block addr : 0019FF3C , b memory block addr: 0019FF38
 x : 5 , y : 3
Press any key to continue

可以发现:采用指针方式修改指向内存块的值时,也会为形参分配新的地址,但是形参指向的内存块的地址与实参相同,故对形参指向的内存块的值进行修改,实参指向的内存块的值即发生相同的改变,故可以完成值的交换。


#include <stdio.h> void swap2(int &a , int &b)//使用引用方式,串引用方式{  printf(" a addr : %d , b addr: %d\n", &a , &b);  int temp = a;  a = b;  b = temp;}int main()  {   int x=3 , y=5; printf(" x : %d , y : %d\n", x , y); printf(" x addr : %d , y addr: %d\n", &x , &y); swap2(x , y); printf(" x : %d , y : %d\n", x , y); return 0;}  


运行结果:

 x : 3 , y : 5
 x addr : 1703740 , y addr: 1703736
 a addr : 1703740 , b addr: 1703736
 x : 5 , y : 3
Press any key to continue

可以发现:利用引用参数可以成功完成数值交换,调用swap2(x,y);则int &a=x;int &b=y; 那么a相当于x的别名,b相当于y的别名,交换a和b的值即相当于交换x和y的值。

注:引用是一种特殊类型的变量,我们可以认为它是另一个变量的别名,利用引用名和原来的变量名访问变量的效果是一样的。引用的形式是:类型标识符 &引用名。比如:

       int  i, j; 
       int &ri=i;    // 建立一个int型的引用ri,并将其初始化为变量i的一个别名
       j=10;
       ri=j;          // 相当于 i=j;




原创粉丝点击