C語言之引數傳遞

2022-08-24 02:48:07 字數 2357 閱讀 7058

學了四年的計算機,一直讓自己比較苦惱的問題是c語言的引數傳遞問題,之所以說是苦惱,是因為在某年的乙個學期,不幸接觸到資料結構,光乙個鍊錶就把自己弄得死去活來的,而且自已一直就楞以為在操作的過程中,傳遞引數的指標也在發生變化,結果可想而知,資料結構成了自己專業課裡面險些掛彩的一門課程。

直至最近,拿出資料結構打算惡補一下前些年欠下的債,第一件事情,還是先解決好當時困擾自己半年之久的c語言引數傳遞問題吧。

c語言課堂上,自己明明記得引數傳遞問題我已經搞懂了,只不過當時沒有接觸過c plus plus,所以除了值傳遞和位址傳遞,我就根本不知道還有一種引用傳遞。現在想起來,自己那時候學的還是馬馬虎虎,太過自信認為自己已經完全掌握引數傳遞的實質。閒話少說,直入正題。

弄懂c語言引數傳遞之前,我們先要清楚以下幾個概念:函式引數中的形式引數和實際引數

首先定義上面

形式引數:形參出現在函式定義中,在整個函式體內都可以使用,離開該函式則不能使用。

實際引數:實參出現在主調函式中,進入被調函式後,實參變數也不能使用。

形參和實參的功能是作資料傳送。發生函式呼叫時,主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。

函式的形參和實參具有以下特點:

1. 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。函式呼叫結束返回主調函式後則不能再使用該形參變數。

2. 實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。

3. 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生型別不匹配」的錯誤。

4. 函式呼叫中發生的資料傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。

對於函式引數值傳遞形式,其引數傳遞的過程是:

(1)行參與實參各佔乙個獨立的儲存空間。

(2)行參的儲存空間是函式被呼叫時才分配的。呼叫開始,系統為行參開闢乙個臨時儲存區,然後將各實參之值傳遞給行參,這時行參就得到了實參的值。

(3)函式返回時,臨時儲存區也被撤銷。

傳值的特點:單向傳遞,即函式中對行參變數的操作不會影響到呼叫函式中的實參變數。

示例:

1 #include

以下為值傳遞的被調函式

1

void change_by_value( int

x )

主函式,呼叫被調函式並輸出

1

intmain()

程式的輸出為:

a = 3

a = 3

void change_by_value(int x)內部發生的動作應當是當函式被呼叫時(堆疊呼叫)在堆疊上臨時分配了一塊區域,呼叫結束,出棧。其詳細解釋如下:

1

void change_by_value( int

x )

對於函式引數位址傳遞形式,其原理和值傳遞方式一樣,當呼叫函式時也要為形式引數分配記憶體,被調函式執行完畢後也要**記憶體。不同

1 #include

以下為位址傳遞的被調函式

1

void change_by_address( int *x )

主函式,用於呼叫被調函式

1

intmain()

程式輸出為:

a = 3

a = 13

1

void change_by_address( int *x )

實參和行參共享乙個儲存單元,對行參的操作相應的就改變了實參,此時引數傳遞是雙向的。

小結:值傳遞:作為引數的變數,傳遞給函式執行後,自己的變數值是不變的。它(實參)僅僅只是把值賦給了形參,自己實際上是沒有參與函式運算的,參與的是形參,這個就是引數的值傳遞。值傳遞好比是你把檔案複製乙份,通過網路傳給他,然後他可以在他本機上對檔案做任何的修改,修改會儲存下來,但是你機器上的檔案不會發生任何的變化。即形參與實參是兩個不同的變數,各自占用不同的儲存單元。

位址傳遞:位址傳遞跟值傳遞也沒有什麼不同,值傳遞是把變數的值傳遞給形參去參與函式運算,而位址傳遞則把變數的位址傳遞給形參去參與函式運算。當然,如果函式改變了變數位址的值,實參的值也會變化的。位址傳遞好比是你把檔案在網路上的位址告訴他人,他人通過網路訪問你機器上的檔案,他可以對檔案進行修改並儲存,此時,檔案的內容就會發生變化。即形參與實參是相同的變數,占用同一段記憶體空間。

C 語言之引數傳遞

非引用傳遞 答 當用實參副本初始化形參時,函式並沒有訪問呼叫所傳遞的實參本身,因此不會修改實參的值。指標形參 答 與其他非引 用型別的形參一樣,該類形參的任何改變也僅作用於區域性副本。例如 void reset int ip 313 呼叫 reset 後,實參依然保持原來的值,但它所指向的物件的值將...

c語言之可變引數

define align n sizeof n 3 0xfffffffc 記憶體對齊 define va start ap,v ap char v align v 根據第乙個引數的首位址和型別以及記憶體對齊規則確定第乙個可變引數的位址 define va arg ap,t t ap align t ...

C語言引數傳遞

c 語言引數傳遞方式有傳值和傳位址兩種方式。1 傳值方式 原理 形參和實參佔不同記憶體單元,傳遞的實際上是實參變數或表示式的乙個拷貝副本,將這個副本值傳給形參,形參記憶體單元內容儲存的正是這個副本值,相當於給形參進行初始化,形參的值發生變化也不會傳回給實參,因此是單向傳遞。例如 void incre...