C語言中自定義函數(shù)一個最常見的注意點就是區(qū)分“值傳遞”和“址傳遞”了。“值傳遞”和“址傳遞”就一個字不一樣,而且發(fā)音還非常的接近,但就是天壤之別。許多初學C語言的小伙伴經(jīng)常搞不清通過函數(shù)傳遞一個數(shù)據(jù)值和傳遞一個地址,以至于C程序的運行結(jié)果大相徑庭。本回答就來詳細講解下C語言中“址傳遞”和“值傳遞”的區(qū)別。
一、值傳遞和址傳遞的C程序代碼
為了說清“值傳遞”和“址傳遞”之間的區(qū)別,我們先看一段C程序代碼,如下:
上述C程序代碼非常簡單:在C程序的main函數(shù)中定義了兩個整型變量para1與para2,初始值分別是1和2;還有一個指針變量pInt,初始值是變量para2的地址。
在C程序的main函數(shù)中,先調(diào)用了自定義函數(shù)ValueTrans,并且把變量para1作為參數(shù)。在自定義函數(shù)ValueTrans中,將變量para1重新賦值為11。在調(diào)用完函數(shù)ValueTrans后輸出變量para1的值,看看是多少;
在C程序的main函數(shù)中,再次調(diào)用了自定義函數(shù)AddrTrans,并且把指針pInt作為參數(shù)。在自定義函數(shù)AddrTrans中,將指針pInt指向的值重新賦值為22。在調(diào)用完函數(shù)AddrTrans后輸出變量para2的值,看看是多少;
現(xiàn)在我們看看這段C程序的運行結(jié)果:
驚不驚喜?意不意外?
二、值傳遞和址傳遞的解釋
現(xiàn)在我們來解釋下上述C程序代碼為何是這么個運行結(jié)果。
1、值傳遞
上述C程序代碼調(diào)用函數(shù)ValueTrans,把變量para1作為參數(shù),注意就是把變量para1的值1作為參數(shù)。
在具體執(zhí)行函數(shù)ValueTrans時,系統(tǒng)自己默默地、悄悄地在某一個地方新建了一個也叫作para1的整型變量。這個整型變量para1可不是C程序代碼main函數(shù)中的那個para1.我們可以把main函數(shù)中的para1變量看做是main_para1,把函數(shù)ValueTrans中的para1看做是ValueTrans_para1.那么在函數(shù)ValueTrans中其實是把11賦值給了變量ValueTrans_para1,至于變量main_para1嘛,紋絲不動!
所以在C程序main函數(shù)中,最后變量para1的值還是1.
2、址傳遞
上述C程序代碼調(diào)用函數(shù)AddrTrans,把指針pInt作為參數(shù),注意此時就是把變量para2的地址作為參數(shù),這就有意思啦!
在具體執(zhí)行函數(shù)AddrTrans時,系統(tǒng)自己同樣地、悄悄地在某一個地方新建了一個也叫作pInt的指針變量。但是這個指針變量pInt的值就是main函數(shù)中的那個pInt的值.換句話說,兩個指針變量pInt同時指向了C程序中main函數(shù)的變量para2。那么在函數(shù)AddrTrans中把22賦值給了指針pInt指向的值,其實也就改變了main函數(shù)中的變量para2的值,太神奇了!這就是C語言指針的魅力所在!
所以在C程序main函數(shù)中,最后變量para2的值就變成了22.
上述是C語言編程中自定義函數(shù)時要注意的一個地方。你明白了嗎?