Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

再谈swap()交换函数....a,b

再谈谈这个老得再老的、仅次于hello world 的小问题。

    开始吧,有两种方式来达到交换a,b的方法,一种是 引用,另一种是传址调用.

    引用就不多说了,int swap(int& a,int& b)就搞定,下面说说传址调用。

   首先说明下指针在语言中的作用:

1)为了避免大量不必要的内存拷贝,尤其是调用函数的时候

2)为了更加方便的直接操作内存(这便是指针的伟大之处)

3)更加省时省力的写代码,更加方便的管理大量同类的数据结构

   知道了这些便有了对指针的大致了解,现在开始看看swap()了

     先看一段代码:

 

int swap(int* ap,int* bp)
{
  
int* temp=ap;
  ap
=bp;
  bp
=temp;
  
return 1;
}

 

 

呵呵,很明显,这段代码的功能是不能实现a,b调换的,这个代码目的可能是交换指针 ap和bp 的指向,可是结果是失败的,因为ap,bp都是形参,在调用函数时他们都是要被拷贝的,也就是说你操作的是a和b的副本,当函数结束时,不会对ap,bp产生任何影响,当然会失败了,

       我们退一步,即使会成功地改变这两个指针,于是我们可以这样,将指针作为引用传递进去,可以这样写:int swap(int& *ap,int& *bp),呵呵是么??答案是:不可以!!编译错误!我们不能定义一个指针的引用,因为用在这里相当于在main函数里写&a=3;其中&a是个常量,不是变量,无法赋值,不能这样定义是为了防止上述情况发生的。

     再返回头来看程序,这里指针的存在是为了对内存的直接操作,前段代码显然没有明白这一点,如果我们想对指向int a 和b 的指针进行操作,而不是对内存进行直接操作,可以用指向指针的指针来达到目的,看下述代码:

 

int swap(int** app,int** bpp)
{
int* temp=*app;
*app=*bpp;
*bpp=temp;
return 1;
}
int main()
{
int a,b;
cin
>>a>>b;
int* ap=&a,* bp=&b;
swap(
&ap,&bp);
cout
<<*ap<<*bp;
return 1;
}

 

 

看,他成功得交换了两个指针的指向,可是,我们是多此一举的,上述swap()的本质还是对指针所指向的内存进行了修改,也就是对指针的内存进行了修改,从而改变了指针的指向,达到了交换的目的,很明显,这样是在做无用功,因为本应该可以这样写:

 

int swap(int* ap,int* bp)
{
   int temp=*ap;
   *ap=*bp;
   *bp=temp;
    return 1;
}
 int main()
{
   int a,b;
  cin>>a>>b;
  swap(&a,&b);
  cout<<a<<b;
   return 1;
}

 

 

我们一样达到了目的,指向指针的指针在此处是多余的(我们必须承认,指向指针的指针在很多地方还是无法取代和替换的),恩,看来问题解决了,这个问题可以告一段落了。

posted on 2010-02-03 22:43  Lvpengms  阅读(4016)  评论(0编辑  收藏  举报