很多初學(xué)者搞不明白子函數(shù)中什么時(shí)候可以改變實(shí)參值,什么時(shí)候不會(huì)改變。今天來(lái)具體分析下。
先來(lái)解釋下實(shí)參和形參,所謂實(shí)參,就是通過(guò)主函數(shù)傳遞給子函數(shù)的變量。而子函數(shù)中用來(lái)接收變量的參數(shù)就稱形參。如下:
點(diǎn)擊(此處)折疊或打開(kāi)
以上代碼中,x,y是main函數(shù)要傳遞給子函數(shù)fun的實(shí)參,而p,q就是用來(lái)接收x和y的值的形參,所以,形參和實(shí)參的類型必須相同。 函數(shù)在傳參過(guò)程中,是一個(gè)內(nèi)容的拷貝過(guò)程,而每個(gè)函數(shù)都會(huì)有自己的??臻g來(lái)存放局部變量,所以,形參和實(shí)參是不同的內(nèi)存單元。通俗點(diǎn)講,就是,你改變他們其中一個(gè)的值,另一個(gè)的值不會(huì)改變。
如上程序,main函數(shù)將x和y傳給了fun函數(shù)的p和q,相當(dāng)于p和q是對(duì)x和y的拷貝,p和q是存放于fun函數(shù)的??臻g的,x和y是存放于main函數(shù)的??臻g,它們是不同的內(nèi)存單元,所以在fun函數(shù)中交換p和q的值并不影響x和y的值,x和y的值仍然分別為1和2。而且,隨著fun函數(shù)的結(jié)束,p和q這兩個(gè)局部變量會(huì)被釋放。
但是,當(dāng)你傳遞的參數(shù)是個(gè)指針的時(shí)候,就可以改變實(shí)參的值,以下通過(guò)程序來(lái)詳細(xì)分析。
點(diǎn)擊(此處)折疊或打開(kāi)
這段程序的輸出結(jié)果為2 1。這是為什么呢?
main函數(shù)在給fun函數(shù)傳遞參數(shù)時(shí),傳遞的是x和y的地址,而fun函數(shù)用p和q接收了這兩個(gè)地址,也就是,p中存放的是x的地址,q中存放的是y的地址,即*p和*q就分別是x和y了,然后再將*p和*q進(jìn)行交換,也就是將x和y進(jìn)行了交換,所以最終x的值為2,y的值為1。
但是如下程序傳了指針,卻沒(méi)有改變x和y的值:
點(diǎn)擊(此處)折疊或打開(kāi)
這段程序輸出結(jié)果為1 2。為什么呢?
雖然main函數(shù)將x和y的地址傳給了fun函數(shù),但是fun函數(shù)交換的是p和q的值,也就是,只對(duì)兩個(gè)地址進(jìn)行了交換,此時(shí)p中存放y的地址,q中存放x的地址,但是,這并沒(méi)有影響x和y的值,所以x仍為1,y仍為2。
由上面3個(gè)程序,我們可以知道,對(duì)子函數(shù)形參的改變,并不影響main函數(shù)實(shí)參的值;但是,當(dāng)main函數(shù)實(shí)參傳遞的是變量的地址,子函數(shù)形參作為指針p的時(shí)候,對(duì)*p進(jìn)行操作,會(huì)改變main函數(shù)中變量的值;但是如果單純對(duì)指針p進(jìn)行操作,也一樣不會(huì)影響main函數(shù)中實(shí)參的值。
聯(lián)系客服