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