函式資料傳遞
一、形式引數和實際引數間的資料傳遞
形參出現在被調函式當中,在整個函式體內都可以使用。形參在定義時編譯系統並不分配儲存空間,只有在呼叫該函式時才分配記憶體單元。呼叫結束記憶體單元被釋放,故形參只有在函式呼叫時有效,呼叫結束時不能再使用。
實參出現在主調函式當中,當函式呼叫時,主調函式把實參的值傳送給被調函式的形參,從而實現函式間的資料傳遞。傳遞方式有兩種:值傳遞和位址傳遞方式。
在呼叫函式過程中,系統會把實參的值傳遞給被呼叫函式的形參。或者說,形參從實參得到乙個
zhi。該值在函式呼叫期間有效,可以參加該函式中的運算。
在呼叫函式過程中發生的實參與形參間的資料傳遞,常稱為「虛實結合」。
例:輸入兩個整數,要求輸出其中值較大者。要求用函式來找到大數。
程式: (
1)先編寫
max函式:
int max(int x,int y)
//定義
max函式,有兩個引數
(2)再編寫主函式
#include
int main()
把二者組合為乙個程式檔案,主函式在前面,
max函式在下面。
程式分析:先定義
nax函式(第一行末尾沒有分號),第一行定義了乙個函式名
max,函式型別為
int,指定兩個形參x和
y,形參的型別為
int。
主函式包含了乙個函式呼叫
max(a,
b)。max後面括號內的
ab是實參。a和
b在main
函式中定義的變數,x和
y是函式
max的形式引數。通過函式呼叫,在兩個函式之間發生資料傳遞,實參a和
b的值傳遞給形參x和
y,在max函式中把x和
y中的大者賦給變數z,
z的值作為函式返回
main
函式,賦給變數c。
當形參定義為變數時,實參可以是常量、變數和表示式,這種函式間的引數傳遞為值傳遞方式。值傳遞的特點是引數的「單向傳遞」;只能由實參傳給形參,而不能由形參傳給實參。
二、陣列元素作為函式引數
陣列元素又稱為下標變數,它具有普通變數的一切性質,因此陣列元素作為函式的實參進行資料傳遞是與普通變數沒有任何區別,也是值傳遞。
三、位址傳遞方式
位址傳遞方式也是在形式引數和實際引數之間傳遞資料的一種方式。
位址傳遞方式所傳遞的是位址。呼叫函式時,將實際引數的位址賦予對應的形式引數作為其位址。由於形式引數和實際引數位址相同,即它們占用相同的記憶體。所以呼叫時,可以看成將實際引數的值傳遞給形式引數:返回時,可以看成將形式引數的值回帶給對應的實際引數。其特點是「引數值的雙向傳遞」。
由此可知,採用位址傳遞方式的實際引數只能是變數的位址、陣列名
(陣列首位址
)或指標變數等,而接受位址值的形式引數也只能是指標變數或陣列名。
例:交換兩個變數的值。
swap (int *x1, int *x2)
main()
執行結果為
a=12, b=23
a=23, b=12
在此程式中實參指標變數p1、
p2將變數
a,b的位址傳遞給
swap
函式的形參指標變數x1、
x2在swap
函式中通過
temp
變數交換x1、
x2所指向儲存單元即a、
b變數的值實現交換變數a、
b值的目的。
四、全域性變數傳遞方式
全域性變數是指在函式之外定義的變數。如果在函式之外定義了全域性變數則該變數的作用域從變數的定義位置開始到本源程式檔案結束在其作用域中任何函式均可以使用全域性變數。在全域性變數的作用域中如某一函式改變了全域性變數的值則在其後使用的是改變後的全域性變數的值。由於全域性變數定義後其作用域中的函式都可使用它從而也可以實現函式間資料的傳遞。在這種傳遞方式中
利用的是系統分配給全域性變數的記憶體單元即全域性變數的記憶體單元位址不變其實也是一種位址傳遞。
五、返回值方式
返回值方式不是在形式引數和實際引數之間傳遞資料,而是通過函式呼叫後直接返回乙個值到主調函式中。因此這種方式通常適用於從被調函式中將乙個值傳回主調函式。
利用返回值的方式傳遞資料,在定義函式時,必須要注意下列兩點:
(1)函式頭中要有
「資料型別說明符
」,說明該函式返回值的資料型別。
(2)函式體中應有
「return(
表示式);」
語句,其中表示式值就是函式返回值。
函式的資料傳遞
從函式的形式看,函式可以分為無參函式和有參函式兩類。在呼叫無參函式時,主調函式並不將資料傳遞給被調函式,呼叫函式一般是為了執行一定的操作 在呼叫有參函式時,主調函式與被調函式之間有資料傳遞關係。一 值傳遞 在陣列元素作為函式實參 陣列元素不能用作形參 時,把實參的值傳遞給形參,是 值傳遞 方式。資料...
C 函式間資料傳遞方式
c 資料傳遞的三種方式 值傳遞 傳值 指標傳遞 傳址 引用傳遞 引用 引用 是c 相對於c新加的 效果 傳值不改變外部物件,傳址和引用改變外部物件。說明 引用和傳址其實一回事,最終的效果,就是函式使用位址改變了外部物件。引用通過變數名和取址符 完成,傳址通過指標完成。值傳遞 傳值 include u...
JAVA資料傳遞
1 對於原始資料型別,也就是int long char之類的型別,是傳值的,如果你在方法中修改了值,方法呼叫結束後,那個變數的值沒用改變。2 對於物件型別,也就是object的子類,如果你在方法中修改了它的成員的值,那個修改是生效的,方法呼叫結束後,它的成員是新的值,但是如果你把它指向乙個其它的物件...