关于函数实现数值交换

#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;




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值