zoukankan      html  css  js  c++  java
  • 再谈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;
    }

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

  • 相关阅读:
    VirtualApp
    python安装包遇到问题解决
    NMS_非极大值抑制的作用
    解释残差结构的有效性
    使用tcpdump命令抓取sql
    linux进程绑定cpu内核
    查询表空间占用情况
    数据库表分区
    Windows下如何使用ab命令做并发测试
    TCP协议
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1663057.html
Copyright © 2011-2022 走看看