C 中引用型別和引用關鍵字ref 區別說明

2022-03-06 17:31:21 字數 2070 閱讀 3648

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 標題...