今天看php手冊時,看到引用那一章節時,有這麼一段**:
<?php
$baz = "hello world!";
function foo (&$var)
$bar = "heihei";
echo "$bar
";foo($bar);
執行這段**,$bar的值並沒有被修改,兩次輸出的值是相同的,為什麼是這樣?echo "$bar
"?>
關於這段**,手冊是這個解釋的:這將使
foo函式中的
$var
變數在函式呼叫時和
$bar
繫結在一起,但接著又被重新繫結到了
$globals["baz"]
上面。不可能通過引用機制將
$bar
在函式呼叫範圍內繫結到別的變數上面,因為在函式
foo中並沒有變數
$bar
(它被表示為
$var
,但是
$var
只有變數內容而沒有呼叫符號表中的名字到值的繫結)。
當時看到這裡有點不能理解,為什麼通過引用傳遞還是不能修改$bar的值呢?想了半天,是不是因為這個引用:$var =& $globals["baz"];
這裡$baz通過乙個引用傳遞,而$var本身也是乙個引用,這樣的傳遞效果是不是同直接的值傳遞效果一樣呢?
後來想,是不是可以這樣理解:呼叫foo($bar)時,傳進去的是乙個引用沒錯,那麼把傳進去的引用當成$bar引用的乙個副本,該副本進入函式後,遇到語句 $bar =& $globals["baz"],然後該副本的值被修改為$globals["baz"]的引用,然後函式結束,因為這裡只是修改了副本,副本指向的值(即$bar的值)並沒有被修改,所以對$bar的值無影響。如果將$var =& $globals["baz"];換成$var = $globals["baz"];,將這個引用去掉,那麼修改的是副本指向的值,即$bar指向的值被修改了。
寫到這裡,我不僅想到以前在碰到乙個問題,**如下:
void exchange(int *a, int *b)
int main()
這段**能否達到交換a,b的值得目的,顯然不能,道理跟上面一樣。
用引用傳遞函式引數
1 引用傳遞引數 傳遞引用給函式與傳遞指標的效果一樣,傳遞的是原來的變數或物件,而不是在函式作用域內建立變數或物件的副本。在8 6節中,我們看到對swap int,int 傳值方式函式的呼叫不影響呼叫函式中的實參,結果並未達到交換資料的預想目的。使用指標傳遞方式的swap int int 函式的呼叫...
C 函式傳遞引用指標引數問題
僅作為參考 記錄 函式如果直接傳遞指標,如呼叫init linklist l l的初始指向為null,對l進行賦值,l指標不在指向null,而是指向new linklist 後的位址,但是無法對傳入的實參進行修改,l仍然指向null 這裡指標的傳遞仍然為值傳遞 初始化鍊錶 status init l...
結構體作為函式引數(值傳遞,引用傳遞,指標傳遞)
一 值傳遞 include include using namespace std struct student void outcome student s 引用傳遞不會進行記憶體重新分配,因此和指標傳參類似,效率很高 void outcome student s 引用傳參 outcome stu...