單鏈表作爲形參時,&與*的區別

&和*的大致比較

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的改變。此時實參形參一樣。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章