交換指針


通常情況下,我們只是對普通數據進行交換,交換指針的問題很少涉及,今天看書時候想到了指針交換問題,這里總結下,也方便我以后查閱。

首先看下整型兩個數據的交換(這個比較簡單,就不多介紹了),核心代碼如下:

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/

好,就這些了,希望對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM