您的位置:首页 > 其它

关于函数实现数值交换

2017-08-17 15:02 232 查看
#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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐