找回密码
 注册
搜索
查看: 1154|回复: 6

[讨论] swap( int* p1,int* p2 )请教

[复制链接]
发表于 2006-12-21 14:35:58 | 显示全部楼层 |阅读模式
swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}
为什么不写成这样呢?
swap( int* p1,int* p2 )
{
 int p;
 p = p1;
 p1 = p2;
 p2 = p;
}
发表于 2006-12-21 21:37:01 | 显示全部楼层
1) 设计目的是交换两个指针指向的变量的值。
2) C函数都是传值调用,p1和p2都相当于临时变量。
所以:

swap(int *p1, int *p2)
{
  int p;

  p = *p1;
  *p1 = *p2;
  *p2 = p;
}

swap2(int *p1, int *p2)
{
  int *p; /* 如果写成int p则类型不匹配,需要强制类型转换 */

  p = p1;
  p1 = p2;
  p2 = p;
}

int main(void)
{
  int a, b;

  a = 1;
  b = 2;
  swap(&a, &b);
  printf("a = %d, b = %d\n", a, b);

  a = 1;
  b = 2;
  swap2(&a, &b);
  printf("a = %d, b = %d\n", a, b);

  return 0;
}

输出结果:

a = 2, b = 1
a = 1, b = 2
点评回复

使用道具 举报

 楼主| 发表于 2006-12-22 11:09:39 | 显示全部楼层
结果知道了,原因还不是很懂啊
点评回复

使用道具 举报

发表于 2006-12-22 20:39:55 | 显示全部楼层
因为C函数都是传值调用,所以调用swap2()时,比如:

  int a = 1;
  int b = 2;
  int *p_a = &a;
  int *p_b = &b;

  swap2(p_a, p_b);

大致相当于:

  int a = 1;
  int b = 2;
  int *p_a = &a;
  int *p_b = &b;

  {
    int *p1 = p_a;
    int *p2 = p_b;
    int *p;

    p = p1;
    p1 = p2;
    p2 = p;
  }

改变的只是局部变量p1、p2、p的值,
而p_a、p_b、a、b的值均未改变。
点评回复

使用道具 举报

发表于 2006-12-22 21:07:24 | 显示全部楼层
而调用swap()时,比如:

  int a = 1;
  int b = 2;
  int *p_a = &a;
  int *p_b = &b;

  swap(p_a, p_b);

大致相当于:

  int a = 1;
  int b = 2;
  int *p_a = &a;
  int *p_b = &b;

  {
    int *p1 = p_a;
    int *p2 = p_b;
    int p;

    p = *p1;
    *p1 = *p2;
    *p2 = p;
  }

p_a、p_b的值均未改变。
而a、b的值则通过p1、p2这两个指针改变了。
点评回复

使用道具 举报

 楼主| 发表于 2006-12-26 15:25:40 | 显示全部楼层
多谢,讲的太好了,应该加分啊
点评回复

使用道具 举报

发表于 2006-12-27 15:36:09 | 显示全部楼层
指针基础知识,多多理解即可。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-27 08:08 , Processed in 0.045717 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表