• 交换指针


    通常情况下,我们只是对普通数据进行交换,交换指针的问题很少涉及,今天看书时候想到了指针交换问题,这里总结下,也方便我以后查阅。

    首先看下整型两个数据的交换(这个比较简单,就不多介绍了),核心代码如下:

    1 void m_swap(int *a,int *b)
    2 {
    3         int tmp = *a;
    4         *a = *b;
    5         *b = tmp;
    6 }

    指针是内存地址,应该也算是整型变量,交换两个指针和交换两个整型变量类似,下面以两种方式进行。

    传统C方式

    可以通过传递指向指针的指针来进行交换,核心代码如下:

    1 void m_swap(int **a,int **b)
    2 {
    3         int *tmp = *a;
    4         *a = *b;
    5         *b = tmp;
    6 }

    demo如下: 

    View Code
    #include <iostream>
    using namespace std;
    
    void m_swap(int **a,int **b)
    {
            int *tmp = *a;
            *a = *b;
            *b = tmp;
    }
    
    int main()
    {
            int a=10,b=20;
            int *pa = &a,*pb = &b;
            cout<<"a = "<<a<<" , b = "<<b<<endl;
            cout<<"*pa = "<<*pa<<" , *pb = "<<*pb<<endl;
            cout<<"pa = "<<pa<<" , pb = "<<pb<<endl<<endl;
            m_swap(&pa,&pb);
            cout<<"a = "<<a<<" , b = "<<b<<endl;
            cout<<"*pa = "<<*pa<<" , *pb = "<<*pb<<endl;
            cout<<"pa = "<<pa<<" , pb = "<<pb<<endl;
    }

    输出结果:

    从结果看到,ab的值没有变,变的是papb这两个指针的值。

    C++引用方式

    也可以通过传递指向指针的引用来实现指针的交换。

    需用*定义指针,用&定义引用,如果要交换两个指针,形参类型如下(以int为例):

    int *&ptr

    这个从右至左理解,首先ptr是个引用,需要用&符号,其次ptr与指向int型对象的指针相关联,需要用*符号。

    则交换指针的核心代码如下: 

    1 void ptrSwp(int *&pi,int *&pj)
    2 {
    3         int *pk = pi;
    4         pi = pj;
    5         pj = pk;
    6 }

     demo如下: 

    View Code
    #include <iostream>
    
    using namespace std;
    
    
    void ptrSwp(int *&pi,int *&pj)
    {
            int *pk = pi;
            pi = pj;
            pj = pk;
    }
    
    int main()
    {
            int i=42,j=24;
            int *pi=&i,*pj=&j;
            cout<<"i : "<<i<<"\tj : "<<j<<endl;
            cout<<"*pi : "<<*pi<<"\t*pj : "<<*pj<<endl;
            cout<<"pi : "<<pi<<"\tpj : "<<pj<<endl<<endl;
            ptrSwp(pi,pj);
            cout<<"i : "<<i<<"\tj : "<<j<<endl;
            cout<<"*pi : "<<*pi<<"\t*pj : "<<*pj<<endl;
            cout<<"pi : "<<pi<<"\tpj : "<<pj<<endl;
    }

    完整demo :https://gist.github.com/3953398

    tips:

    C++标准库中已经实现了std::swap的功能,使用模版实现的,我们没必要重复造轮子,直接用就是了,不懂的朋友参考这里:http://www.cplusplus.com/reference/algorithm/swap/

    好,就这些了,希望对你有帮助。

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
  • 相关阅读:
    CodeForces
    网络流
    poj 2185
    树的分治学习
    数位DP
    URAL 1969. Hong Kong Tram
    hdu 4759 Poker Shuffle
    hdu3712 Detector Placement
    分块思想
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/swapPtr20121026.html
  • Copyright © 2020-2023  润新知