函式引數用指標或引用傳遞時發現的乙個小問題

2021-06-14 16:53:37 字數 1229 閱讀 8098

今天看php手冊時,看到引用那一章節時,有這麼一段**:

<?php
$baz = "hello world!";

function foo (&$var)

$bar = "heihei";
echo "$bar

";foo($bar);

echo "$bar

"?>

執行這段**,$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...