C語言寫函式交換兩個數的值,為什麼一定要用指標

2021-06-25 15:02:44 字數 3699 閱讀 6265

1樓:娛樂小八卦啊

運用**解釋指標運用的理解如下:

#include

using namespace std;

int fun1 (int a,int b)

int c;

c=a;a=b;b=c;

cout<<"a1:"

int *c;

c=a;a=b;b=c;

cout<<"a2:"<<*a<<";b2:"<<*b

int *c;

c=*a;*a=*b;*b=c;

cout<<"a3:"<<*a<<";b3:"<<*b

int c;

c=*a;*a=*b;*b=c;

cout<<"a4:"<<*a<<";b4:"<<*b

int c;

c=a;a=b;b=c;

cout<<"a5:"

int aa=1,bb=2;

fun1(aa,bb);

cout<<"aa1:"

cout<<"aa2:"

cout<<"aa3:"

cout<<"aa4:"

fun5(aa,bb);

cout<<"aa5:"

輸出結果為:

a1:2;b1:1

aa1:1;bb1:2

a2:2;b2:1

aa2:1;bb2:2

aa3:1;bb3:2

a4:2;b4:1

aa4:2;bb4:1

a5:2;b5:1

aa5:2;bb5:1

main中呼叫fun1()時,將實參a,b的值傳遞給了交換函式,如果此時在swap1中列印,可以看到結果是正確的,但是該過程其實是將aa和bb分別複製了一份給了函式,執行完fun1()之後,aa和bb的值沒有任何變化。

fun2(),看似的確使用了指標,但還是失敗,因為這裡是將aa和bb的地址給交換了,而並沒有交換aa和bb的值。在這裡由於未給c賦值,c中並沒有確定的值,c中的值是不可預見的。此時c可能指向一個未知的儲存單元。

而嚴重的情況是,該單元的資料可能是有用的,因此fun2()不但沒有實現兩個數的交換,反而給系統的穩定性帶來威脅。

fun3(),將int賦值給int *,編譯錯誤。

fun4()是正確的。為了在函式中改變了的變數能被其它函式呼叫,正確的辦法是用指標變數作為函式引數,在函式執行過程中使指標變數所指向的變數值發生變化。

函式呼叫結束後,哲別變數值的變化依然保留下來,這樣就實現了通過函式呼叫是變數的值發生變化,在其它函式中可以使用這些改變了的值的目的。

fun5()也是正確的,這是引用的重要應用之一。對於引用的操作實際上是作用在引用所因的物件上。

擴充套件資料

在函式中的引數,並不是呼叫者的變數,而是臨時申請的變數a和b存放main函式中變數a和b的值,並在函式中用來計算,在fun中給a和b賦值都是在操作這兩個臨時申請的變數,函式返回後,這兩個變數被捨棄,函式呼叫也沒有將這兩個臨時變數的值返回給main函式中呼叫使用的引數功能。

所以,在函式中要操作呼叫者申請的變數,需要給出它們的指標,函式中用指標來找到這些變數的位置和內容。

2樓:匿名使用者

void swap(int *xx,int *yy)上面這種才可以。

你的兩個方法中,第一種方法,雖然引數是指標,但是作為引數的指標也還是臨時複製的,你在方法裡互換操作的是臨時指標而不是指標指向的內容

第二種方法,引數是兩個int變數,但作為引數這兩個變數只是臨時複製了一份,操作這兩個複製的臨時值並不能改變本體。

3樓:

c語言轉換變數的值,並不是直接轉換,而是通過反覆賦值進行值的覆蓋;有三種轉換方式,傳值,傳址,傳引用。如果不用指標,將b值符給a後,a,b的值是一樣的,a值的儲存地址不變,輸出時還是a值;而用指標後,通過指標指向地址,可進行地址層面的轉換,輸出電腦以為的a時,其實是b的地址上的b值才將兩個變數的值完全交換,此為傳址轉換。

4樓:

因為給函式引數分配的空間是臨時的 用完就被**了。

c語言中如何交換兩個指標變數的的值

5樓:小小歐平兒

1、首先,就是最基本的知識,寫標頭檔案、函式宣告、定義變數。

2、下面還需要定義指標,需要定義兩個指標p1和p2,然後把a的地址賦值給p1,把b的地址賦值給p2。

3、然後就是呼叫函式,該函式沒有返回值,就直接呼叫,但是引數進入的是a和b的地址,而不是a和b。

4、函式點用完之後,就是輸出a和b的值看一看是否互換了。

5、首先,a和b的地址傳給x和y,通過指標直接對a和b的值進行操作。

6、最後,就是調換*x和*y的值,這樣就是實現了a和b的值。

6樓:匿名使用者

交換兩個指標變數的的值有兩種不同的形式:

在指標定義所在函式交換兩個指標變數的值

這種交換,與交換兩個整型變數的值方法相同,分三步:

先將pa儲存到臨時變數pt中,

再將pb儲存到pa中,

最後將pt儲存到pb中

通過自定義函式進行交換兩個指標變數的值

這種交換,必須要傳遞兩個指標變數的地址到自定義函式中(即函式的形參是二維指標),然後在函式中對收到的二維指標變數中的內容進行交換,即可實現實參的交換。

7樓:匿名使用者

定義一箇中間變數t(也是結構體型別的):

t=p1;

p1=p2;

p2=t;就行了

8樓:匿名使用者

定義一個指標變數temp,*temp=*p1;*p1=*p2;*p2=*temp;

9樓:匿名使用者

#include

struct student

;void main()

10樓:

int a, b;

int *p1=&a,*p2=&b,*temp;

temp=p1; p1=p2;p2=temp;

這樣就完成交換

11樓:

4 int main(void)

5 add;

11 12 int *p;

13 int *q;

14 15 add.data = 1;

16 add.id =2;

17 p = &add.data;

18 q = &add.id;

19 printf("before turn p = %d q = %d\n",*p,*q);

20 p = &add.id;

21 q = &add.data;

22 printf("after turn p = %d q = %d\n",*p,*q);

23 24 return 0;

25 }

C語言,這樣為什麼不可以實現兩個數值的交換

因為在swap函式中,a b是x y的資料複製品,其變化與x y本身無關,如果要交換,需要傳遞x y的位址到子函式中,進行交換!1 include 2 void swap int a int b 3 10 int main 11 因為在swap函式中,a b的位址和x y的位址不同,其變化與x y本...

關於c語言求較大數的問題,c語言中兩個數中取較大的乙個數怎麼表示

你在console中的輸 入一定bai是 8,9 回車du 這是錯誤的,正確的輸入如zhi下 8 9 回車 原因dao是內你格式化字串時,容用的是scanf d d a,b 兩個 d中間沒逗號,你輸入個逗號肯定就錯了,這樣的話,b的值是個負數,所以你看到輸出結果為8 你的 是對的啊,注意輸入兩個數的...

用C語言程式設計實現 輸入整數,求出這兩個數的平均值並列印輸出到螢幕。要求使用自定義函式並呼叫

include double calc int a,int b void main c語言,編寫乙個程式從鍵盤上輸入兩個整數,並求出兩個數的平均值在螢幕上輸出結果 c語言實現 include int main c語言程式設計.由鍵盤輸入兩個整數,分別計算這兩個數的和 差 積 商,並輸出結果。具體輸入...