黑马程序员技术交流社区

标题: 原来指针可以这么简单 [打印本页]

作者: 周易    时间: 2014-8-15 01:12
标题: 原来指针可以这么简单
http://bbs.itheima.com/thread-136901-1-1.html   这是上次的不通过第三方变量来交换两个数的值。其实这样的方法很愚蠢,效率不高。认真研习了指针可以更好的用这样的方法去解决以上问题。其关键代码如下:
void jh(char *a,char *b)
        {char y;
          y=*a;
          *a=*b;
       *b = y;
}
jh(&a,&)
作者: Meniny    时间: 2014-8-15 01:14
这还是用了第三个变量啊亲
作者: fantacyleo    时间: 2014-8-15 01:58
我觉得所有的两变量交换法都挺愚蠢的,可读性差不说,局限性还很大
作者: chengnuoaini030    时间: 2014-8-15 14:32
对啊,这个y不还是第三个变量嘛……
作者: xiniuniu    时间: 2014-8-16 08:52
本帖最后由 xiniuniu 于 2014-8-16 09:01 编辑

简单就是好的,我感觉 这样的交换不错,我们一眼就可以看出,是两个变量中的数据进行交换

同样不用第三方变量进行交换比较效率的还是使用异或的特性

  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {

  4.     int a = 100;
  5.     int b = 200;
  6.     printf("交换前a = %d , b = %d\n", a, b);
  7.    
  8.     a ^= b;
  9.     b ^= a;
  10.     a ^= b;
  11.    
  12.     printf("交换后a = %d , b = %d\n", a, b);
  13.     return 0;
  14. }
复制代码


虽然这个程序比较效率但可读性要差了一些。原理示例:如果a = 110b;  b = 010b;(b表示二进制)

   110 (a)
^ 010 (b)       ------>第一次异或  a = 100 ;  b= 010;

   010 (b)
^ 100 (a)    ------>第二次异或  a = 100;  b= 110;


   100 (a)
^ 110 (b)  ------>第三次异或  a = 010 ;  b= 110;


作者: Meniny    时间: 2014-8-16 08:59
晕。。。。之前看过一个,楼上这个貌似可以的。但是要注意,别连起来,否则不同的编译器出的结果是不一样的
作者: xiniuniu    时间: 2014-8-16 09:03
Meniny 发表于 2014-8-16 08:59
晕。。。。之前看过一个,楼上这个貌似可以的。但是要注意,别连起来,否则不同的编译器出的结果是不一样的 ...

不连起来是什么意思?
作者: Meniny    时间: 2014-8-16 09:08
xiniuniu 发表于 2014-8-16 09:03
不连起来是什么意思?

就是不要写成:
  1. a ^= b ^= a ^=b;
复制代码

因为这样试图在序列点之间两次修改变量a,这种做法是未定义的,在不同的编译器下可能会出现不同结果,比如icc
作者: xiniuniu    时间: 2014-8-16 09:28
Meniny 发表于 2014-8-16 09:08
就是不要写成:

因为这样试图在序列点之间两次修改变量a,这种做法是未定义的,在不同的编译器下可能会 ...

所以我把三次操作都分开了。这样写法太晕了。编程中一行中最好只写一条语句
作者: Meniny    时间: 2014-8-16 09:32
xiniuniu 发表于 2014-8-16 09:28
所以我把三次操作都分开了。这样写法太晕了。编程中一行中最好只写一条语句 ...

嗯,是这样




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2