交换指针

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

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

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/

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

posted on 2012-10-26 00:47  Mike_Zhang  阅读(6424)  评论(3编辑  收藏  举报