c#中函式傳遞引用型別是直接位址傳遞(複製),而引用關鍵字ref是直接使用引數。
那有什麼區別呢?下面給大家看看比較好玩的東西。
現在有個標準的鍊錶結構
定義乙個節點型別
class node測試函式,這裡是直接傳遞引用型別。public node next
}
static void test(node list)下面呼叫測試函式,並看看結果。
static void main(string args)結果大家猜猜?}
1?2?
這裡是引用型別,結果當然是2啦~~。
那我換換?
static void test(ref node list)結果大家猜猜?
1?2?
還是2,這裡是引用關鍵字。
現在大家就問啦~說了這麼多廢話,傳遞引用型別和引用關鍵字ref傳遞不是一樣麼?
那麼下面就是見證奇蹟的時候了~~~~
我在函式裡面給他換乙個節點,嘿嘿,換頭大行動啦~~~
static void test(node list)注意現在沒用ref關鍵字!
那麼現在結果是什麼呢?
結果絕對出乎你的意料~~~嘿嘿
是。。。。。。。。
?!有木有!有木有!
咦?2呢?
不急,淡定,下面我們來看看加個ref關鍵字有什麼變化
static void test(ref node list)結果居然,居然變成了2!!!!
有麼有!有麼有!
怎麼和上面的不一樣啦?!?!
這裡我來解釋下,其實就是ref的作用啦~~
我先在記憶體中建立了乙個節點並且賦值1,然後把head指向它。接下來到test函式裡面,這裡把head指向的位址給了list,現在head和list都指向我一開始賦值1的那塊記憶體,我現在改list.data和head.data其實都是一樣的,反正他們都是指向那一塊記憶體,就像我我做第一輛公車到目的地還是做第二輛,結果都是一樣的到目的地。
那麼為什麼換頭大行動的時候把1改為2為什麼沒有成功呢?
其實在本行動中不是修改原來那塊記憶體,而是重新分配一塊記憶體出來,然後把list指向它。所以head指向的那塊記憶體還是好好的在原來的地方,它居然躲過了我們的殘忍行動!!
那麼加了ref有什麼不同呢?
好~~~現在時光倒流啦~~~我倒~~我倒~~
現在我剛剛在記憶體中建了乙個節點並賦值1,然後把head指向它。注意現在就是不同的地方,這裡由於用了ref關鍵字,現在不是把head指向的位址給了list,而是把head取了個別名list,那麼現在list就是head,head就是list啦。然後我們就開始換頭啦~~這裡把list指向的位址改為我們新建立的記憶體塊(頭),既然list就是head,那麼這裡其實就是把head指向的記憶體塊(頭)給換了,當然head就不是以前的head了。就像換來換去只換了一輛不同的公車,沒換目的地一樣。
所以這就是出現我們在建立鍊錶的時候,有時給他加個節點沒有加成功的原因。你沒有加到原來的那塊記憶體塊後面,而是新建了個記憶體塊,把煉表頭指到別的地方了。
static void insert(node head, int item)明顯第乙個可以成功新增,但是第二個~~哎~~沒救了~~隨便怎麼改都是換同一路公車的不同車輛,沒換目的地。這樣轉車當然不成功啦~node temp = new node();
temp.next = null;
temp.data = item;
head.next = temp;
}
static void errorinsert(node head, int item)
node temp = new node();
temp.next = null;
temp.data = item;
head = temp;
}
所以總的來說引用型別就是不同公交車輛都去同乙個目的地,而ref修飾的則是同一輛公交,但是重新刷了廣告,也就是起了個別名。
C 基礎 值型別 引用型別與ref關鍵字
1 inta 10 b 20 2void swap intx,inty 3 1 void swap int x,int y 2 1 class program 2 78 static void main string args 9 14 1 class program 2 78 static voi...
引用和const關鍵字
引用的概念 1.定義引用時一定要將其初始化成某個變數 2初始化後,他就一直引用這個變數,不會在引用其他變數了,也就是說引用是至始至終的 3.引用只能引用變數,不能引用常量和表示式double a 4,b 5 double r1 a double r2 r1 r2 10 cout r1 b 不是引用,...
引用 global關鍵字
引用賦值 data id 1 id 2 articlelist id 1 title 標題1 id 2 title 標題2 foreach data as key val print r data exit 輸出 array 0 array id 1 info array id 1 title 標題...