C語言引數傳遞

2021-06-06 21:49:22 字數 1149 閱讀 1770

c

語言引數傳遞方式有傳值和傳位址兩種方式。

1、傳值方式

原理:形參和實參佔不同記憶體單元,傳遞的實際上是實參變數或表示式的乙個拷貝副本,將這個副本值傳給形參,形參記憶體單元內容儲存的正是這個副本值,相當於給形參進行初始化,形參的值發生變化也不會傳回給實參,因此是單向傳遞。

例如:void increase(int x)

當在主函式中呼叫上面這個函式時,會在

ncrease

函式記憶體棧中為形參

x分配乙個記憶體單元,然後把實參的值傳到這個記憶體單元中,相當於給形參初初化了,然後形參x自增

1,它改變的僅僅是形參記憶體單元中的內容,而實參記憶體單元中的內容並沒有改變。當被呼叫函式執行完畢後,形參所分配的記憶體單元也被收回。

2、傳位址方式

原理:和傳值方式一樣,當呼叫函式時也要為形參分配記憶體,被調函式執行完畢後也要收回記憶體。不同的是傳遞的是實參變數位址的拷貝值,而不是實參變數的值,在被調函式中對位址所指物件的操作會改變實參的值。但是形參的內容即存放的實參變數位址並不會改變。

例如:void increase(int * x)

int main()

主函式呼叫被調函式後,主函式中的i和

*x的值都會改變。

我曾經在做關於鍊錶的實驗時,想先寫乙個初始化結點的函式,用

malloc

給結點分配記憶體,然後給主函式呼叫。

struct node

當初始化函式按下面這樣寫就會有問題:

int  init(struct node *n)

return 0; }

在主函式中定義

struct node *n

;然後執行

init(n)

;編譯能通過,但執行會報錯。

因為雖然用了指標傳遞方式,但是被調函式只能改變

n所指物件即結構體中成員的值,但其本身的值即位址並不會改變。

有兩種解決辦法,一是形參用雙指標變數,一是被呼叫函式返回值型別設為結構體指標型別。

如:int  init(struct node **n)

return 0;}

n是乙個雙指標變數,它存放結構體指標變數的位址。

如:或是被呼叫函式返回值型別設為結構體指標型別

struct node *  init()

C語言可變引數,引數傳遞

c語言可變引數,引數傳遞 eureka 函式形參在函式中儲存是按照棧的方式來儲存的 例項 include void fun int a0,int a1,int a2,int a3 intmain 函式輸出為 1 2 3 4 2 一般函式的定義在記憶體中的儲存方式 一般的變數定義之後,相同的變數型別儲...

C 語言之引數傳遞

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

c語言傳遞引數

1.標準資料型別,int char 等。如果c傳遞的是單個資料型別,會在被調函式中重新建立乙個物件。所以,無論我們在被調函式中怎麼修改,主調函式的值不會發生變化。2.陣列。當我們傳遞的引數是乙個陣列時,c傳遞的是陣列首元素的位址。所以當我們在被調函式中做修改了,主調函式的值也會變化。3.自定義資料型...