C C 語言函式引數傳遞 傳值,傳指標,傳引用

2021-07-09 08:54:48 字數 1220 閱讀 6574

前面我們介紹了函式的呼叫約定,明白了函式呼叫者與被呼叫者之間傳遞引數的順序與如何進行棧恢復的。 實際上,函式呼叫者如何將引數傳遞給被呼叫者也是有講究的。 總的來說,函式引數傳遞分為3種情況:傳值,傳指標和傳引用。

首先,理解一下實參與形參的概念。

int func(int x)//x是形參

int main(void)

上面的**中,x是形參,a是實參。形參x是實參a的乙個拷貝。

一,傳值

所謂傳值,顧名思義,就是把實參的值直接傳遞給函式。因為形參是實參的拷貝,所以傳值無法改變實參。在c++裡面,如果傳遞的是物件, 那麼,在傳值過程中,還會隱式的呼叫物件的拷貝建構函式,有一定的計算執行開銷。

void func(int x)//func採用了傳值的形式

int main(void)

分析:上面的程式採用了傳值的引數傳遞形式,把a的值0傳遞給了func函式,而由於x是a的乙個拷貝,因此,x=x+1值修改了x的值 並沒有修改a的值。所以上面程式執行的結果,輸出為:

x=1a=0

二,傳指標

傳指標就是把實參的位址傳遞給函式。傳指標可以修改實參的值,在c++裡也不會存在呼叫物件的拷貝建構函式的問題, 傳指標的效率比傳值要高。所以,如果需要修改實參的值,就不能傳值,而需要傳指標等。

但是,傳指標比傳值複雜,指標計算一旦移動出了正常範圍,會造成程式的非法訪問等。

void func(int *x)//func採用了傳指標的形式

int main(void)

分析:傳指標可以修改實參的值。根據指標的定義,*x就是a,所以,*x=*x+1,即為a = a+1,所以上面的**輸出結果為:

*x=1

a=1三,傳引用

所謂引用其實就是變數的乙個別名。傳引用是c++裡面引入的一種引數傳遞方法。傳引用實際上也是傳遞的實參的指標,所以能夠修改實參的值。 但是,引用的特性告訴我們,一旦引用初始化後,這個引用就不能再改變。所以,傳遞引用實際上是擁有傳值的方便簡單,也同時 具備了傳指標的高效,又沒傳指標的危險,相對安全。

void func(int &x)//func採用了傳引用的形式

int main(void)

分析:func採用傳引用的方法定義,實參a引用傳遞給函式func之後,func能夠修改實參的值。所以上面的程式執行結果為:

x=1a=1

總之:傳值不能修改實參,且如果是物件,效率較低;傳指標能夠修改實參,效率較高,但容易出錯;傳引用能夠修改實參,效率較高,而且不易出錯。

C語言函式引數的傳遞,傳值和傳址

void swap int x,int y void swap1 int x,int y 雖然swap1是按位址傳遞引數,本質上swap和swap1是一樣的,只是swap的形參型別是int型,而swap1的形參型別是int 型。把變數的值傳遞給函式的形式引數,實際上是用變數的值來新生成乙個形式引數,...

Python的函式引數傳遞 傳值?引用?

python的函式引數傳遞 傳值?引用?在開始之前,我們有必要分清一下python的一些基礎概念。首先要說的是 變數 與 物件 變數和值要分開 在python中,型別屬於物件,變數是沒有型別的,這正是python的語言特性,也是吸引著很多pythoner的一點。所有的變數都可以理解是記憶體中乙個物件...

Python的函式引數傳遞 傳值?引用?

我想,這個標題或許是很多初學者的問題。尤其是像我這樣的對c c 比較熟悉,剛剛進入python殿堂的朋友們 c c 的函式引數的傳遞方式根深蒂固的影響這我們的思維 引用?傳值?究竟是那種呢。呵呵,語言的特性決定了是使用的方法,那麼,現在我們來 一下python的函式引數傳遞方式。在開始之前,我們有必...