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.自定義資料型...