1. 程式人生 > >C語言小程式--交換兩個變數的值

C語言小程式--交換兩個變數的值



看到這個題目首先我們可以想到藉助一個第三變數來實現

例如:a=10,b=20  我們想要交換a與b的值,可以藉助一個第三變數temp,把a的值附給temp,把b的值給a,再把temp的值給b,就完成了交換。

起初我們可能寫出這樣的程式碼:

#include<stdio.h>
swap_num(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 10, b = 20;
	printf("交換前 a = %d,b = %d \n", a, b);
	swap_num(a, b);
	printf("交換後 a = %d,b = %d \n", a, b);
	system("pause");
	return 0;
}

這段程式碼看似正確,但是它到底能不能得到我們想要的結果呢?執行一下就知道


咦~沒有交換,這是為什麼呢?我們來看下記憶體視窗,看看到底哪裡出錯了吧!


這裡我們可以看到x和y的值確實交換了,但是我們發現a與x,b與y的地址並不相同,這是因為在c中函式的所有引數均已“傳值呼叫”的方式進行傳遞。也就是說,我們剛剛在swap_num函式中的引數x和y只是我們要交換的資料a和b的一份臨時拷貝,而我們真正想要交換的值並沒有進行交換。

那我們應該如何正確地實現兩個函式的交換呢?為了達到訪問呼叫程式的值,我們必須給函式傳遞希望修改值的地址,這樣函式便可以通過這個地址找出要修改的值,並對其進行修改了。因此我們對上面的程式做了如下改進:

#include<stdio.h>
swap_num(int *x, int *y)
{
	int  tmp =*x;
	*x =* y;
	*y = tmp;
}
int main()
{
	int a = 10, b = 20;
	printf("交換前 a = %d,b = %d \n", a, b);
	swap_num(&a, &b);
	printf("交換後 a = %d,b = %d \n", a, b);
	system("pause");
	return 0;
}

這次程式會得到我們想要的結果嗎?驗證一下就知道啦~


再檢視下記憶體視窗,會發現這x和y中分別儲存的是a和b的地址,在函式呼叫完成後a和b的值也發生了變化

這種方法就是我們常說的函式中的“傳址呼叫”。

上面的方法做出來以後,我們又想有沒有辦法不使用中間變數就交換兩個變數的值呢?稍加思考,其實這個也不難,我們可以藉助數學中的加減運算來實現。

例如:a=10,b=20 令 a=a+b; 把a-b賦給b(注意:此處的a是重新賦值後的,即 a+b),再把a-b賦給a(此處的a和b都是重新賦值後的),這樣就實現了兩個數的交換。

程式碼如下:

#include <stdio.h>
int main()
{
	int a = 10, b = 20;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a =%d ,b=%d", a, b);
	system("pause");
	return 0;
}

因為這種方法特別簡單,所以我就在主函式中寫了,如果讀者想要包裝成函式,不要忘記要傳給函式的是a和b的地址哦!

除了上述方法,還可以使用異或運算來實現兩個變數的值交換

具體實現如下:

#include <stdio.h>
int main()
{
	int a = 10, b = 20;
	printf("交換前a = %d,b = %d \n", a, b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("交換後 a = %d,b = %d \n", a, b);
	system("pause");
	return 0;
}