&和*的大致比較
int a=10; int *b=&a; (設a的地址是3000)
a=10,&a=3000;b=3000;*b=10;
&取地址運算符。目的是值的引用,即實參和形參一樣,對形參進行修改就會影響到實參;
*指針運算符。目的是地址的傳遞,傳遞後實參,形參指向同一地址;
正常數值當作形參傳入函數時
兩圖做對比,圖一中形參a,b和圖二中*a,*b類似,都幾乎等於實參,所以改變傳入的值就會影響實參。
因此都能交換a和b的值。
將鏈表頭結點作爲形參傳入函數時
下面兩張圖分別兩種方式穿參,第一張圖中無遍歷鏈表,第二張圖片有
修改地方:第一張的void CreateList(LNode* head, int n)改爲了void CreateList(LNode* &head, int n)
圖一是值傳遞,圖二爲引用傳遞。
爲什麼第二張不能正常運行呢?
兩張圖從CreatrList()函數代碼分析來看,兩個形參head最後都指向了鏈表的尾節點。
但是圖一依舊能夠使用實參head進行遍歷,而圖二卻不行。如下圖
設剛傳入值時實參head和形參head地址都是A。
經過函數後:圖一的形參到了F處,但是圖一的實參還是在A處(還處於頭結點處);
圖二的形參也到了F處,但是圖二的實參也隨形參改變到了F處(尾結點);
因此遍歷的時候圖二情況實參head已經不是頭結點了。
所以若要用引用傳遞的方式傳參,需要在函數中新定義一個結點來代替頭結點head,防止由於形參head改變而導致了實參head的改變。此時實參形參一樣。