通過函式給指標賦值(二)交換兩個變數的值

2021-06-23 00:25:58 字數 2043 閱讀 4402

1、由乙個函式講起,實現功能:交換兩個變數的值。可能很多人想到的是這樣乙個函式:

void swap(int a, int b)

2、但是,上述函式的呼叫結果是錯誤的:

原始碼:

// csdn_swap.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

void swap(int a, int b);

int _tmain(int argc, _tchar* argv)

void swap(int a, int b)

執行結果:

顯然,swap函式的**有問題。

3、實際上,除了引用(c中無引用),所有的函式的引數都會生成副本,也就是說,函式中實際參與運算的並不是傳入的值,而是傳入的值的乙個副本。

4、所謂的副本即是值一樣的另乙個量,所以上述swap函式參與運算的相當於a『和b』,a『是a的乙個副本,兩者僅僅是值相等;同理,b』是b的乙個副本。實際參與運算的是a'和b'(即swap函式體中的a,b實際上是a'和b')。

5、因為參與運算的是引數的副本,所以改變的也是引數的副本,而對於引數本身,引數的副本改變並不影響引數本身的值。所以,上述swap函式執行後,兩個值並未交換。

6、解決方法一:c++引用(c語言中無引用)

void swap(int &a, int &b)

原始碼:

// csdn_swap.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

void swap(int &a, int &b);

int _tmain(int argc, _tchar* argv)

void swap(int &a, int &b)

執行結果:

7、解決方法二:使用指標(因為指標生成的副本 指向的記憶體區域不變)

void swap(int *a, int *b)

原始碼:

// csdn_swap.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

// 指標

void swap(int *a, int *b);

int _tmain(int argc, _tchar* argv)

void swap(int *a, int *b)

執行結果:

8、解決方法三:使用指標的指標

void swap(int **a, int **b)

原始碼:

// csdn_swap.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

// 指標的指標

void swap(int **a, int **b);

int _tmain(int argc, _tchar* argv)

return 0;

}void swap(int **a, int **b)

執行結果:

9、解決方法一和二交換的是「值」,解決方法三交換的是「位址」。

通過Swap函式交換兩個變數的值

正確 void swap int p1,int p2 定義乙個整形變數tmp,p1 a p2 b,首先在tmp裡存入a的值,然後將b的值賦給a,再將tmp裡的值賦給。這樣就完成了a與b兩個數的交換。我們經常會發現自己寫出的程式並不能達到我們的要求,在寫這類題的時候我們也可能寫過以下三種錯誤的編寫方式...

關於如何通過Swap函式交換兩個變數的值

資料交換在c語言中十分常見。作為初學者首先學的應該都是如下方式 int main 這種交換如果放在乙個函式中沒錯,但如果將它們分別放在子函式和主函式中就會發生錯誤。錯誤示例1 void swap int a,int b int main 其結果是列印出來的a,b值並沒有交換。這是因為在子函式中定義的...

交換兩個int型別指標的問題

在剛剛接觸c語言的時候我們一定學過乙個swap函式來交換兩個數 void swap int a,int b 顯然上面的函式是錯的,因為傳進去的a是形參,在函式內部a,b進行交換並不會影響函式外a和b的值,為了解決這個問題,我們改為傳入a和b的位址進去,通過解引用將a和b的值交換,這樣就可以真正意義上...