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

2022-06-10 08:27:28 字數 6230 閱讀 3324

1樓:匿名使用者

因為在swap函式中,a b是x y的資料複製品,其變化與x y本身無關,如果要交換,需要傳遞x y的位址到子函式中,進行交換!

1 #include

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

10 int main()11

2樓:匿名使用者

因為在swap函式中,a b的位址和x y的位址不同,其變化與x y本身無關,如果要交換,需要把x y的位址傳到子函式中,進行交換!

#include

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

3樓:陽頂天鹿鼎記

這樣的實現相當於實參給形參賦值,形參是子函式中的變數,他與實參完全沒有關係,在子函式中實現了兩個形參的值進行互換,對實參無影響

若想實現實參的值互換,則可把形參型別改為指標或者引用,這樣操作形參,即是操作實參。

4樓:crazy_小豬

呼叫這個 swap(x,y);函式,只是將xy的值傳遞過去了,就像你把x,y的複製體傳過去了,在swap()函式裡改變的是x,y的複製體,而不是x,y的原版。

這是一種值傳遞的方式,你可以使用位址傳遞,即:將xy的位址當引數。swap(&x,&y)

還有一種方式是傳引用,即的實現如下:

5 int temp;

6 temp=a;

7 a=b;

8 b=temp;

這樣,x,y的值也會改變!

5樓:全球百科知識文庫

簡單一點說,就是函式傳遞的時候有幾種傳遞方式,一種是值傳遞,一種是引用傳遞,一種是位址傳遞.你這裡是值傳遞方式.也就是說,傳遞進去的只是實參的乙個拷貝.

拷貝只是區域性變數,當子程式返回時,就會被析構.所以,實參並沒有被改變

void swap(int& a ,int& b )可以改為這樣,(引用傳遞)

void swap(int* a,int* b)或者這樣,(位址傳遞)

6樓:

你可以這樣理解呼叫swap(x,y)會跳轉到swap函式內,swap函式開始執行前會初始化變數

int a=x;int b=y;這裡交換的a、b不是x、y;

7樓:匿名使用者

你呼叫函式是採用傳值方式,將x y的值傳遞過去,但是x y卻並未發生改變

要想改變,建議傳位址,用指標交換

ab你可以看做是xy的複製品

8樓:匿名使用者

用void swap(int& a,int& b)就可以

形參是你呼叫函式時候建立的臨時變數,函式結束該變數就被丟棄了

9樓:我可不是導演

普通的非引用型別的引數通過複製對應的實參實現初始化。當用實參副本初始化形參時,函式並沒有訪問呼叫所傳遞的實參本身,因此不會修改實參的值。

對於你這個程式,在執行swap時,只交換了實參的區域性副本,而傳遞給swap的實參並沒有被修改。

c語言交換兩個數的問題????

10樓:

兩段**的差異是:

第二段**:將a、b兩個數的位址傳入swap()函式,此函式內部將這兩個位址彼此做了交換(即兩個指標所指的位址發生了互換,但相應位址下的數並沒有變化)。因為對於函式swap()來說,傳入的兩個位址是值傳遞形式的,在其內部是區域性作用域下的兩個變數,完成這兩個位址「值」的交換,並不能對呼叫時的實參產生影響。

故而交換失敗。

另外,再給你個無需中間變數交換兩個數值的寫法:

a = b - a + (b = a);    // 無需中間變數交換a、b的值

11樓:何處可人生

你第二的個函式是在改變指標,你可以用指標的指標試試

c語言,函式來交換兩個數值,為什麼我執行的結果兩個數值沒有交換?

12樓:牢思語

你的交換函式中的變數只在交換函式中有效,所以沒辦法影響函式外的變數,應該傳指標

13樓:匿名使用者

你這是按值傳遞

swap(&a,&b);

void swap (int *n,int *m)

14樓:黑夜不是我

你交換的只是swap函式內的區域性變數n,m值,應該改成這樣#include

void swap (int *n,int *m)void main()

注意函式形參的傳值和傳位址的區別

15樓:做而論道

這函式,確實不能轉換。

c語言程式設計:使輸入兩個數,交換他們的值並輸出。 是否可以這樣編寫

16樓:育知同創教育

#include

int main ()

c語言用函式如何實現兩個數交換?

17樓:匿名使用者

#include"stdio.h"int swap(int *a,int *b)

main()

18樓:天平座de魚

c語言用函式如何實現兩個數交換的話?比較難發揮。

19樓:倒霉熊

#include

main()

printf("%d > %d\n",*za,*zb);

printf("%d > %d\n",a,b);

}int hanshu(int *x,int *y)

20樓:匿名使用者

int hanshu(int *x,int *y)這裡應把temp定義為int型

int temp;

temp = *x;

*x = *y;

*y = temp;

這樣就內對容了

21樓:溪貝溪貝

#include

void huhuan(int*, int*);

int main(void)

void huhuan(int*m, int*n)

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

22樓:娛樂小八卦啊

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

#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函式中呼叫使用的引數功能。

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

23樓:匿名使用者

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

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

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

24樓:

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

25樓:

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

c語言 編寫程式,從鍵盤上輸入兩個不同的整數,讓兩個整數實現資料交換。怎麼解答 求大神

26樓:風火輪

#include

int main()

else

return 0;}

27樓:匿名使用者

int main()

28樓:愛我苗藝

#include

int main()

c語言中用函式交換兩個變數的值?

29樓:苑人考尹

這個無法交換資料。

c語言函式引數的基本規則是值傳遞,所以傳遞時只能實現實參向形參的單向的、值的傳遞。這就是為什麼需要使用指標才能實現值交換的原因。

30樓:

輸入變數:x,y

#include

void main()

void f(int*xp,int*yp )呼叫函式後,x,y的值就被交換了

31樓:匿名使用者

應該在void swap(int x,int y)

裡新增一句,如上

32樓:匿名使用者

#include "stdio.h"

#include "conio.h"

void swap(int* x,int *y)main()

兩個男生為什麼不可以手拉手

女生手拉手可以理解,如果男生,就不理解了,會用另類眼光來看待。再說,兩個大男人拉拉扯扯。有失大雅。因為在中國這個古老而現代的國家。人生第一重要的事情就是結婚生孩子。兩個男人在一起時注定不能繁衍生息的。而且我國本來對於同性還沒有那麼開放。很多人都會有偏見!兩個女生手拉手大家覺得是好朋友,兩個男生手拉手...

C語言,為什麼結果出來兩個n不同

真心的小愛 標準c與經典c的比較 本附錄列出了標準c與經典c之間 即kernighan和ritchie合著的the c programming language一書第 1版所描述的語言 的大多數顯著差異。標題指明瞭本書的哪章在討論每個標準c的特性。本附錄沒有介 紹c庫,因為它已經變化很多年了。如果使...

兄弟兩個或者姐妹或者兄妹兩個可不可以在同一年結婚

當然可以,這個沒有什麼,對於家裡來說,這個還屬於雙喜臨門呢,應該是一件好事才對。兩兄妹可以同一年結婚嗎 為什麼不可以?嫁出去乙個娶回來乙個家庭成員還是那些,双喜啊。不過版,也許不同的地區風權 俗習慣不一樣,這個你可以問問別人,如果確實父母不同意,那可以讓哥先結婚,你也不必急著嫁出去,和家人還有嫂子多...