随笔 - 272  文章 - 0  评论 - 283  阅读 - 142万

交换指针

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

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

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   Mike_Zhang  阅读(6507)  评论(3编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2012年10月 >
30 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

点击右上角即可分享
微信分享提示