轉自:嵌入式大雜燴
交換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;
}
普通的變量傳遞,則不會改變內存內容,以為普通變量作為參數(shù)時,其實是在內存塊(棧空間)中新申請了一塊空閑塊,不是原來的內存塊,而函數(shù)調用完畢之后,這塊新申請的內存塊會由于變量的作用域失效而被系統(tǒng)回收。
如果把指針作為實參進行傳遞,也就是把內存地址傳了過去,那么操作這個指針所指向的內存塊,必然會改變這個內存的內容了。
以上這種方法就是最常見的方法。那么,你知道如何將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位整數(shù)所能表示的范圍,從而造成程序運行錯誤。方法二則沒有這個問題,這是一種比較好的方法。
C++中字符編碼的轉換
手把手教你用STM32Trust生成加密固件
ELF相比Hex、Bin文件格式有哪些與眾不同?
長按前往圖中包含的公眾號關注
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!