C 中,main函式呼叫swap 後無效,怎麼回事兒

2022-11-13 16:30:18 字數 4697 閱讀 5342

1樓:小螞蟻飄踩

你的int swap(int,int) 函式是傳值,這個在實參代入函式的時候會拷貝一個臨時副本給形參,記憶體地址是不一樣的,不是用你本身實參在記憶體地址中實際存在的值,所以你swap函式是對臨時副本的值做值交換,不會影響實際的a,b值。這裡想交換a,b值的話,只要傳遞的是a,b所在實際記憶體地址的值就行了,可以有兩種方法:傳引用(直接是a,b做處理),傳指標(傳入a,b實際地址)

傳指標:

#include

int swap(int *,int *); //函式宣告要改

int main()

int swap(int &x,int &y) //函式宣告要改,其他不用改

2樓:匿名使用者

函式中的形參為區域性變數,並且預設為傳值方式,即 x,y 生成之後拷貝了 a,b 的值,你交換的是 x,y 而並非 a ,b ,可以改為引用形式傳遞或者使用指標。

int swap(int &x,int &y)

3樓:雲林之盟

因為你寫得函式只是兩個數字在函式swap內部交換,形參交換了,並沒用達到實參的交換,如果要傳遞給主函式的實參交換,應該是交換兩個變數a和b的地址就行了。程式如下所示:

#include

using namespace std;

void swap(int *,int *);

int main()

void swap(int *x,int *y)

c++;為什麼這裡用了swap函式而沒有發生交換?

4樓:不知詳解

其實這個問題主要取決於你的swap函式所修改的x,y是不是main函式中的a,b

執行結果告訴你不是.

那麼x,y是什麼呢 x,y代表的是函式棧當中的引數.

相信你聽說過函式呼叫的過程有壓棧這一說法吧。

其實x,y是儲存在棧當中的

函式呼叫的時候會為傳入引數在棧當中生成值相等的副本。

x,y代表的就是這個副本,而不是代表傳入引數。所以你修改x,y不能修改a,b。

如果想要修改a,b就必須知道a,b所在的記憶體地址.所以可以通過傳入地址解決問題.

void swap(int *x,int *y)

如果使用c++可以使用引用解決問題,引用大多數編譯器也是通過指標實現的.

void swap(int &x,int &y)

----------

很多人都說實參和形參是這個問題原因。

其實我說的是本質.形參和實參只是起概念上的作用罷了。並不能準確的理解這個問題.

5樓:匿名使用者

呼叫swap(a,b);可以理解成執行下面這一段**

可以看出,調換的只是x和y的值,a與b的值並沒有發生變化

6樓:

這是因為呼叫函式時進行的是 值傳遞

swap(a,b);實際上執行的是把a的值傳給x,把b的值傳給y,在函式內部把x,y的值交換了。但實際上a,b的值並沒有變。

要想改變a,b的值可以這樣:

#include"iostream.h"

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

int main()

void swap(int *x,int *y)

7樓:

形參改變不影響實參,所以要取地址。**如下。

#include"iostream.h"

void swap(int &x,int &y);

int main()

void swap(int &x,int &y)也可以直接把輸出放在函式中

#include"iostream.h"

void swap(int x,int y);

int main()

void swap(int x,int y)

8樓:匿名使用者

理解形參和實參是解決這個問題的關鍵。。。

9樓:匿名使用者

樓上都已經說的很清楚了,建議 參考值傳遞,指標傳遞,引用傳遞,別名傳遞等不同傳遞方式加以區分;

c++中引用形參的時候,函式呼叫為什麼要放在main的外面?

10樓:匿名使用者

這事情和編譯器相關

編譯器編譯**的時候是從上往下編譯的,遇見函式呼叫它就檢查實參和虛參在數量、型別上對不對應,如果你的函式書寫在呼叫函式前(比如這個swap寫在main前),那麼就沒有問題,因為編譯main的時候已經編譯過swap了,所以認識,但反過來就不行了,先編譯main,發現呼叫了個swap,這時候它還沒見過swap呢,怎麼來檢測引數對不對呢,於是有人想了個辦法,把函式的宣告部分(即第一行)單獨拿出來放在**前面,告訴編譯器後邊有個函式,是什麼什麼型別,什麼什麼引數的,這樣你函式無論書寫在呼叫函式前還是後,就都無所謂了,反正編譯器已經知道你的構造了。這放在前面的函式的第一行就稱作函式的宣告。後來,有人發現將所有函式的宣告都放在**前邊也比較亂,假如有幾百個函式看起來也煩,於是就又出現了 .

h 即標頭檔案,專門放置這類宣告,然後cpp檔案只要用 #include 指令包含進來就可以了,這樣看起來**更有組織一點。

11樓:匿名使用者

#include

using namespace std;

int main()

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

int i=3,j=5;

cout<<"i="

cout<<"i="

temp=a;

a=b;

b=temp;

12樓:匿名使用者

void swap(int &a,int &b);這句是函式宣告不是呼叫,如果swap函式在main前面就不用這句。

swap(i,j);是呼叫

c++中main()函式中不能定義別的函式嗎?

13樓:光環國際

任何一個c++程式都包含一個main函式,這是規定。main函式由系統直接呼叫,是程式執行的入口。

main函式與使用者自己定義的函式都是各自獨立的模組,即函式不能巢狀定義,通俗的說,你不能在一個函式的函式體內定義另一個函式,即使在main函式中也不行。但main函式可以對使用者自己定義的函式進行呼叫(但main函式只能由系統呼叫)。使用者自己定義多個函式時,這幾個使用者自己定義的函式之間都可以互相呼叫。

14樓:匿名使用者

函式中不能定義函式,對於任何函式都不行,這時規定

15樓:匿名使用者

函式的宣告不支援巢狀

我想你的意思是不是某函式放在main後面會出現編譯錯誤吧

在main前面對所有函式進行宣告,然後函式體的定義可以放在後面

16樓:月淵冥

可以定義,但是基本都不會在主函式中定義。因為語法結構和c差不多,比較繁瑣,引用起來也費事,肯定沒在類中定義方便。因為要編大型程式的話基本就只會用類,如果在主函式中呼叫再在類中呼叫實參的話很費事!

所以在c++中,尤其是有類的時候,基本不會在主函式中定義的。因為比較麻煩!但絕不是不能這麼做。

17樓:

只能在函式外定義函式啊!函式內部只能呼叫不能定義!

關於c++傳值呼叫的問題一直不明白

18樓:匿名使用者

函式名稱不重要,是隨便起的一個名稱,這裡使用swap,只是能夠從名稱上看出是做兩個數交換的,你可以隨便換個名字都可以。你可以定義很多函式,完成想要的功能就可以了,這是你變成是定義的,一般會有一些規範,這個規範在作大型軟體時,非常有用,利於大家協作。

19樓:

不一定,只是用swap便於別人閱讀,swap是交換的意思,swap函式名也可以用其他的字母代替。

c++庫函式中是否有swap這個函式啊?

20樓:匿名使用者

swap應該是自己寫的一個交換函式,並不是c/c++系統定義的函式void swap(int&a,int&b)你看看這個

函式把str和本字串交換。

例如:   string first( "this comes first" );

string second( "and this is second" );

first.swap( second );

cout << first << endl;

cout << second << endl;

21樓:匿名使用者

貌似要重新編寫的。c語言我記得當初就重新定義編寫的。

22樓:id鬆綠

是標準函式,可以直接呼叫,預設引數有兩個

23樓:董俊錕

有,是交換兩個數的值

我編寫了一個簡單的程式

可以執行

#include

using namespace std;

int main()

在c 程式中,main函式的位置

main函式的位置不固定。main函式只是說程式從這個函式開始,其他基本和一般函式一樣。只需要確保main函式裡出現的名字在之前有宣告 不需要定義 即可。比如以下形式可以 int foo 宣告並定義foo函式int main 以下形式也可以 int foo 宣告foo函式 int main int ...

c語言和c中主函式main的括號中為什麼可以有引數

這是因為 主函式main並非程式的真正入口 在編譯器對你的工程檔案進行編譯時,它是內先找到你的main函式容,然後根據main函式型別,把一段字首入口程式預先編譯,再讓它去呼叫main函式.當你的main函式需要引數時,它就編譯有引數main函式呼叫,反之則編譯無引數main函式呼叫.所以編譯器是自...

c語言題目(函式呼叫),C語言題目(函式呼叫)

a宣告時形參名可以忽略也可以任意合法的變數名,但是其型別不能忽略。以上的講,可能你不好理解,我來告訴你吧 a型別必須要一樣,而且數量一定要相同,宣告形參可以寫也可以不寫 bc語言中,在宣告函式的時候其形式引數可以只是資料型別不用寫出具體的識別符號,如果要寫出具體的識別符號的話,就一定要和函式定義的識...