要理解值傳遞、指標傳遞和引用傳遞的區別,主要要理解函式的實參和形參,函式的作用域(自動變數、棧),記憶體的布局以及指標和引用的特點。
值傳遞:只給函式提供輸入值,需要複製開銷,大物件很少使用值傳遞。
指標傳遞:可以改變指標指向內容的值,但是不能改變指標本身,無需複製開銷。如果需要改變指標本身,可以使用二重指標或者指標引用。
引用傳遞:除了提供輸入值外,還返回操作結果,無需複製開銷。
對於引用傳遞方式,所傳遞的位址是
通過對實參進行取位址運算來獲得的
;而對於指標傳遞方式,所傳遞的位址就是實參的值。
函式引數傳遞方式之一:值傳遞
值傳遞(
passl-by-value
)過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在堆疊中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。
void swap(int x, int y)
main()
c
是否能交換a,
b的值?
a=1def no_change(a):
printid(a) ###輸出a
的記憶體位址
a=a+1
print id(a)
return a
print no_change(a)
print id id(a),a #########python a
的值是否改變?
函式引數傳遞方式之二:指標傳遞
指標傳遞
(pass-by-pointer)
過程中,同樣也需要在堆疊段中為被呼叫函式的形參列表分配記憶體。但是,由於形參定義為指標型別,從主函式傳遞過來的是實參列表各變數的位址。因此,指標傳遞方式的特點是被調函式對形參的任何操作也都影響到主函式中實參的值。
void swap(int *px, int *py)
main()
c
是否能交換a,
b的值?
b = [1,2,3]
def change_list(b):
print id(b)
b[0] = b[0] + 1
print id(b)
return b
print change_list(b)
printb ######python b
的值是否改變(
list
傳遞的是指標)
函式引數傳遞方式之三:引用傳遞
引用傳遞
(pass-by-reference)
過程中,被調函式的形式引數雖然也作為區域性變數在堆疊中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過堆疊中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數
void swap(int &x, int &y) /*
注意定義處的形式引數的格式與值傳遞不同
*/main()
參考: c/c++中的函式引數傳遞機制
C 函式引數 值傳遞與引用傳遞
以前我們在c語言中函式引數傳遞過程中,如果我們想要讓當a函式作用域中的變數經過b函式處理之後的數值仍然在a函式中生效,這個時候函式引數的傳遞時需要引用方式去傳遞,方式如下 include 函式引數為指標,通過修改指標裡面的內容達到對main中b變數的修改 void func int a int ma...
python函式引數傳遞
例子1 def f x x 0 10 a 1,2 f a a 0 輸出 記憶體空間 命名空間 pos1 list 1,2 a pos1 x pos1 對列表a應用這個函式,python會先讓x指向a所在的記憶體。由於x和a共享同乙個物件,修改x 0 會讓a的值相應改變。例子2 def mod x x...
c 函式引數傳遞
void reset int num void creset const int num void preset int p void cpreset const int p void rreset int arr 10 void initiaresert initializer listlist ...