1. 程式人生 > >C++的函式中,如何使用指標交換兩個數的值,深入理解指標

C++的函式中,如何使用指標交換兩個數的值,深入理解指標

使用外部函式交換兩個變數的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指標和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,後兩種是正確的。第四種使用的是指標,第五種使用的是引用。請看下面五個簡單的函式:

#include<iostream>

using namespace std;

int fun1 (int a,int b)

{

    int c;

    c=a;a=b;b=c;

    cout<<"a1:"<<a<<";b1:"<<b<<endl;

}

int fun2 (int *a,int *b)

{

    int *c;

    c=a;a=b;b=c;

    cout<<"a2:"<<*a<<";b2:"<<*b<<endl;

}

int fun3(int *a,int *b)

{

    int *c;

    c=*a;*a=*b;*b=c;

    cout<<"a3:"<<*a<<";b3:"<<*b<<endl;

}

int fun4 (int *a,int *b)

{

    int c;

    c=*a;*a=*b;*b=c;

    cout<<"a4:"<<*a<<";b4:"<<*b<<endl;

}


int fun5 (int &a,int &b)

{

    int c;

    c=a;a=b;b=c;

    cout<<"a5:"<<a<<";b5:"<<b<<endl;

}

int main()

{


    int aa=1,bb=2;

    fun1(aa,bb);

    cout<<"aa1:"<<aa<<";bb1:"<<bb<<endl;

    fun2(&aa,&bb);

    cout<<"aa2:"<<aa<<";bb2:"<<bb<<endl;

    fun3(&aa,&bb);

    cout<<"aa3:"<<aa<<";bb3:"<<bb<<endl;

    fun4(&aa,&bb);

    cout<<"aa4:"<<aa<<";bb4:"<<bb<<endl;


    aa=1,bb=2;

    fun5(aa,bb);

    cout<<"aa5:"<<aa<<";bb5:"<<bb<<endl;

    return 0;

}

輸出結果為:

a1:2;b1:1
aa1:1;bb1:2
a2:2;b2:1
aa2:1;bb2:2
aa3:1;bb3:2
a4:2;b4:1
aa4:2;bb4:1
a5:2;b5:1
aa5:2;bb5:1

fun1(),如果使用java或者其它高階語言,使用該函式沒什麼問題,甚至是天經地義的,但是C和C++裡卻不行,原因是main中呼叫fun1()時,將實參a,b的值傳遞給了交換函式,如果此時在swap1中列印,可以看到結果是正確的,但是該過程其實是將aa和bb分別複製了一份給了函式,執行完fun1()之後,aa和bb的值沒有任何變化。

fun2(),看似的確使用了指標,但任然失敗,為什麼呢?其實這裡是將aa和bb的地址給交換了,而並沒有交換aa和bb的值。在這裡由於未給c賦值,c中並沒有確定的值,c中的值是不可預見的。此時c可能指向一個未知的儲存單元。而嚴重的情況是,該單元的資料可能是有用的,因此fun2()不但沒有實現兩個數的交換,反而給系統的穩定性帶來威脅。

fun3(),將int賦值給int *,編譯錯誤。

fun4()是正確的。為了在函式中改變了的變數能被其它函式呼叫,正確的辦法是用指標變數作為函式引數,在函式執行過程中使指標變數所指向的變數值發生變化,函式呼叫結束後,哲別變量值的變化依然保留下來,這樣就實現了通過函式呼叫是變數的值發生變化,在其它函式中可以使用這些改變了的值的目的。

fun5()也是正確的,這是引用的重要應用之一。對於引用的操作實際上是作用在引用所因的物件上。