C語言中交換兩個整數的值之傳值呼叫和傳址呼叫

2021-07-23 08:58:40 字數 2198 閱讀 9085

在c語言中,一說到交換兩個整數的值,大家第一反應可能是這樣的**。定義乙個第三方變數來輔助交換。

#includeint main()

這個執行結果我就不拿出來了,他是符合我們預期結果的。那麼,如果要求,不允許定義第三變數交換兩個整數的值,你會怎麼做呢?

那有些人可能會說,不定義第三變數,可以啊,我在主函式外部再寫乙個swap交換函式,通過呼叫函式來交換兩個數的值嘛!於是,就有了這樣的**

#includeint main()

int swap(int x,int y)

那麼我們來看一下執行結果

顯然這個函式並沒有達到預期的效果,那麼問題來了,這是為什麼呢?我明明呼叫了這個函式呀,怎麼就沒有交換數值呢?

這個問題我們先放下,我們先來看一下程式執行過程以及數值和記憶體的變化情況

我們可以看到,我們在呼叫交換函式的時候,主函式中定義的兩個整數num1和num2的值的確傳給了函式的引數x和y,但是,num1和num2的位址與x和y的位址是沒有關聯的,這說明num1和num2給swap函式提供的是當前這兩個變數的值的乙份臨時拷貝,當這兩個變數當前的值被函式呼叫的時候,這兩個變數就與函式沒有關係了。

接下來,函式內部的程式一行行執行結束之後

我們可以看到函式內部的x和y的值交換了。

再跳回到主函式進行輸出,這個時候輸出的num1與num2依舊是主函式中被賦給的值,即傳給函式形參的值,而不是通過函式執行之後的值,所以這個**沒有輸出我們預期的結果。

這也就是我們常說的傳值呼叫。

經過修改之後,我們又寫出了這樣得**

#includeint main()

int swap(int *x,int *y)

我們先來看一下執行結果

毫無疑問,這個結果實現了我們的期望值。我們再來看一下記憶體位址的情況

這裡我們可以看到,num1與num2的位址和x與y的位址相同,也就是說,在呼叫num1和num2這兩個變數的值的時候,我們通過呼叫這兩個變數的位址來引用其位址裡存放的值,這個時候進入到函式內部,把x位址裡的值賦給變數tmp,把y位址裡的值賦給x,再把tmp的值賦給y,也就是說把x位址裡的值放到了y位址裡,把y位址裡的值放到x位址裡,然後返回到主函式中,因為num1與x的位址相同而num2與y的位址相同,所以當x與y的值變了的時候,num1與num2的值也發生了變化,於是輸出結果也就是我們所預期的交換後的值。這就是傳址呼叫。

說到這裡,也許有人又有問題了,你不是說不允許定義第三變數嗎?呼叫的交換函式裡定義的tmp不就是第三變數嘛?

好啦好啦。我的錯啦。這回真的不定義第三變數了。提供兩種方法

第一,加減法運算

num1=num1+num2

num2=num1-num2

num1=num1-num2

#includeint main()

第二,異或運算

首先,我來給大家介紹一下異或運算。相異為1,相同為0。比如3和5異或,即                011^101,

011----->3

101----->5

異或之後

110----->6

101異或之後

011------>3

110異或之後

101------>5

我們可以發現兩個數與這兩個數異或的結果,這三個數每兩兩異或,結果都是第三個數。於是這個**就寫出來了

#includeint main()

這兩個程式結果都是正確的。如期的交換了兩個變數的值。

如有錯誤,歡迎指出!

C語言中交換兩個變數的值

在c語言中,要交換兩個變數的值,對於不同的人,可能會有不同的方法。對於初學者來說,可能是這樣。void swap int x,int y 但是,c語言中的函式呼叫採用的值傳遞,因此在主函式中呼叫該swap函式顯然無法交換兩個變數的值。當然,對於很多使用c語言的人來說,不會犯上面的錯誤,會這麼寫交換函...

c語言 兩個值的交換

指標的呼叫 交換兩個數值 一 子函式 被呼叫函式 的改變要想修改父函式 呼叫函式 的值需要 1.傳指標 2.解引用 二 的實現過程 錯誤一 void swap int a,int b int tmp tmp a a b b tmp int main int a 10 int b 20 swap a,...

C語言交換兩個變數的值

交換a,b變數的值,最簡單的方法,建立中間中間變數c,先把a的值存在c裡,然後把b的值放入a內,最後把c中的值賦給a,就完成了a,b變數值的交換。如下 include 利用中間變數交換兩個變數值 int main 如果不使用中間變數,我們可以利用異或運算來實現兩個變數值的交換。比如變數a 3,b 7...