C語言丨參數(shù)傳遞的方式到底有幾種?
原創(chuàng)作者:三玹
轉(zhuǎn)載請保留相關(guān)信息
什么是參數(shù)傳遞?
在程序運行過程中,將實際參數(shù)的值或者地址傳遞給被調(diào)用函數(shù)的形式參數(shù),從而在函數(shù)中完成對數(shù)據(jù)處理和返回的過程。
在C語言當(dāng)中,參數(shù)的傳遞方式本質(zhì)上只有一種,就是值傳遞。
但為了更好區(qū)分理解,劃分了兩種方式:值傳遞和指針傳遞。下面我們就來聊聊這兩種傳遞方式有什么不同。
值傳遞
值傳遞,是最普通的傳遞方式。將實際參數(shù)的值復(fù)制一份,然后傳遞給形式參數(shù),然后在函數(shù)內(nèi)完成數(shù)據(jù)處理和返回等行為。
由于是復(fù)制的關(guān)系,因此形參在函數(shù)內(nèi)再怎么七十二變,對函數(shù)外部實參的值是沒有任何影響。
下面來看 swap 交換函數(shù)的例子:
void swap(int x, int y){int temp = x;x = y;y = temp;printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", x, y);}int main(){int a=3, int b=4;swap(a, b);printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);return 0;}
指針傳遞
函數(shù)在調(diào)用的時候,形參總是要重新創(chuàng)建一個新的空間。那么有沒有什么辦法,可以讓形參開辟的空間盡可能???
這里,就不得不提到指針。
前面在聊指針類型的時候,有提到在同一個操作系統(tǒng)下,無論什么類型的指針,其所占用的內(nèi)存空間都是一樣的,如32位的操作系統(tǒng)下,指針類型所占空間為 4 個Byte(字節(jié))。
如此一來,我們就可以將形參定義為指針類型。無論實參傳入什么,在函數(shù)調(diào)用時,形參所開辟的空間大小都是一樣的。
下面來看一下swap函數(shù)指針傳遞的案例:
void swap(int *x, int *y){int temp = *x;*x = *y;*y = temp;printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", *x, *y);}int main(){int a=3, int b=4;swap(&a, &b);printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);return 0;}
運行結(jié)果:
swap函數(shù)內(nèi)完成交換后:x=4, y=3
調(diào)用swap函數(shù)后:a=4, b=3
從結(jié)果可以看出,函數(shù)內(nèi)的形參進(jìn)行了交換,同時函數(shù)外的實參也發(fā)生了交換。
這是因為,形參所接收的是內(nèi)存地址,指針可以通過內(nèi)存地址進(jìn)行間接訪問實際變量的值,從而達(dá)到修改實際變量的值。
本質(zhì)上來看,指針傳遞中實參傳給形參的是內(nèi)存地址,而內(nèi)存地址也是一個數(shù)據(jù)、一個值,因此指針傳遞也是屬于值傳遞。
關(guān)于引用傳遞的問題
網(wǎng)上搜索關(guān)于C語言參數(shù)傳遞方式有哪些,第一個搜索結(jié)果就給我個大大的框,C語言中函數(shù)參數(shù)傳遞的三種方式。
作為一個求知者,我是抱著學(xué)習(xí)的態(tài)度去學(xué)的。學(xué)著學(xué)著,發(fā)現(xiàn)不對勁了。
這里所說的三種傳遞方式,包括了上面的兩種方式,還有一種引用傳遞。
檢驗真理的最佳方式,就是實踐!
使用值傳遞和指針傳遞的方式,寫下swap函數(shù),結(jié)果是可以正常運行出來的。說明C語言當(dāng)中是有這兩種傳遞方式。
void swap(int &x, int &y){int temp = x;x = y;y = temp;printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", x, y);}int main(){int a=3, int b=4;swap(a, b);printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);return 0;}
但是在檢驗引用傳遞的例子,還沒運行編輯器就一串爆紅。很顯然,引用傳遞不屬于C語言參數(shù)傳遞的方式。
一番了解之后,才知道所謂的引用傳遞是C++語言中的特性。由于C和C++兩者代碼風(fēng)格和樣式相差不差,所以一開始就給弄混淆了,還真以為引用傳遞也是C語言中的傳遞方式之一。
當(dāng)然也有部分的文章表示,C語言的兩種傳遞方式:值傳遞和引用傳遞。這里的引用傳遞也就是上面說的指針傳遞。
最后

