首頁>技術>

交換a、b的值在C語言的學習中是很常見的問題。最常用的方法就是引入一箇中間變數當做中間介質來交換a、b的值。

程式碼如下:

void change_ab(int *a, int *b){    int temp = 0;    temp = *a;    *a = *b;    *b = temp;}

!!注意不能寫為:

void change_ab(int a, int b){    int temp = 0;    temp = a;    a = b;    b = temp;}

普通的變數傳遞,則不會改變記憶體內容,以為普通變數作為引數時,其實是在記憶體塊(棧空間)中新申請了一塊空閒塊,不是原來的記憶體塊,而函式呼叫完畢之後,這塊新申請的記憶體塊會由於變數的作用域失效而被系統回收。

如果把指標作為實參進行傳遞,也就是把記憶體地址傳了過去,那麼操作這個指標所指向的記憶體塊,必然會改變這個記憶體的內容了。

以上這種方法就是最常見的方法。那麼,你知道如何將a、b的值進行交換,並且不使用任何其他的中間變數?

方法一:採用算術的方法
void change_ab(int *a, int *b){    *a = *a + *b;    *b = *a - *b;    *a = *a - *b;}
方法二:採用異或的方法
void change_ab(int *a, int *b){    *a = *a ^ *b;    *b = *a ^ *b;    *a = *a ^ *b;}

方法一存在一個潛在的危險,當形參的型別改為無符號16位時,若a、b的值很大,那麼a+b的值就有可能超出16位整數所能表示的範圍,從而造成程式執行錯誤。方法二則沒有這個問題,這是一種比較好的方法。

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 安卓應用層協議/框架通殺抓包:實戰篇