|
[导读]交换a、b的值在C语言的学习中是很常见的问题,但最常用的方法就是引入一个中间变量当做中间介质来交换a、b的值。( [$ R8 [# ?* e* @# x 交换a、b的值在C语言的学习中是很常见的问题。最常用的方法就是引入一个中间变量当做中间介质来交换a、b的值。 代码如下: void change_ab(int *a, int *b){& z/ a. V9 F7 C/ L+ @, B$ C int temp = 0;% X# ^" W r8 X* K temp = *a;. A2 X& K! Y3 ~ *a = *b; *b = temp; }1 s1 c+ O2 K, {, p/ D. N) [$ r
注意,不能写为如下代码: void change_ab(int a, int b)& c( t) M3 l8 b) @+ D7 }1 M{; o! L! x9 b' X! ?0 h6 K int temp = 0; temp = a; a = b; b = temp;4 O( _! O& ~) R) C. K& I9 J* o }2 R8 O' }+ q9 P% Y2 N 普通的变量传递,则不会改变内存内容,以为普通变量作为参数时,其实是在内存块(栈空间)中新申请了一块空闲块,不是原来的内存块,而函数调用完毕之后,这块新申请的内存块会由于变量的作用域失效而被系统回收。 如果把指针作为实参进行传递,也就是把内存地址传了过去,那么操作这个指针所指向的内存块,必然会改变这个内存的内容了。 以上这种方法就是最常见的方法。那么,你知道如何将a、b的值进行交换,并且不使用任何其他的中间变量? 方法一:采用算术的方法void change_ab(int *a, int *b): u1 X/ Q: C3 T{ M; p0 i& x8 Q+ [0 S *a = *a + *b;: L+ U8 N4 K) q. c7 ? *b = *a - *b; *a = *a - *b; } 方法二:采用异或的方法void change_ab(int *a, int *b)2 _) t, {, g8 s, D% C8 ` i5 i( [ {5 B/ @& h& I) c% A0 P3 v *a = *a ^ *b; *b = *a ^ *b;, T2 p! _8 \$ k, s *a = *a ^ *b; } 方法一存在一个潜在的危险,当形参的类型改为无符号16位时,若a、b的值很大,那么a+b的值就有可能超出16位整数所能表示的范围,从而造成程序运行错误。方法二则没有这个问题,这是一种比较好的方法。 . S( M3 ~/ w6 S$ E# N; W0 R1 ~5 R/ ^' ] |
| 第一次见,感谢分享 |
微信公众号
手机版