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的值交換,這樣就可以真正意義上...