C 引數傳遞詳解

2021-05-27 01:42:45 字數 2102 閱讀 4737

引數傳遞看似很簡單的東西,但是真正理解它的本質卻並不很容易,在看過《你必須知道的.net》一書後,使我從本質上明白了引數的傳遞。

值型別和引用型別的區別:

值型別(value type),

值型別例項通常分配在執行緒的堆疊(stack)上,並且不包含任何指向例項資料的指標,因為變數本身就包含了其實例資料

引用型別(reference type),引用型別例項分配在託管堆(managed heap)上變數儲存對值的記憶體位址的引用。

using system;

public class test

} 記憶體概況

根據引數型別和傳遞方式不同,有以下4中不同的情況:

1.值型別的引數的按值傳遞

值型別例項傳遞的是該值型別例項的乙個拷貝,因此被呼叫方法操作的是屬於自己本身的例項拷貝,因此不影響原來呼叫方法中的例項值。

using system;

namespace anytao.net.my_must_net

private static void add(int i) }

}2.引用型別引數的按值傳遞

當傳遞的引數為引用型別時,傳遞和操作的是指向物件的引用,這意味著方法操作可以改變原來的物件,但是值得思考的是該引用或者說指標本身還是按值傳遞的。

using system;

namespace anytao.net.my_must_net

private static void addref(argsbyref abf) }

class argsbyref }

按值傳遞的實質的是傳遞值,不同的是這個值在值型別和引用型別的表現是不同的:引數為值型別時,「值」為例項本身,因此傳遞的是例項拷貝,不會對原來的例項產生影響;引數為引用型別時,「值」為物件引用,因此傳遞的是引用位址拷貝,會改變原來物件的引用指向,這是二者在統一概念上的表現區別,理解了本質也就抓住了根源。

3.string型別作為引用型別的特殊性

using system;

namespace anytao.net.my_must_net

static void changeobj(test t)

static void changestr(string astr) }

}下面對上述示例的執行過程簡要分析一下:首先,string str = "old string"產生了乙個新的string物件,然後執行changestr(astr),也就是進行引用型別引數的按值傳遞,我們強調說這裡傳遞的是引用型別的引用值,也就是位址指標;然後呼叫changestr方法,過程astr = "changing string"完成了以下的操作,先在新的乙個位址生成乙個string物件,該新物件的值為"changing string",引用位址為0x06賦給引數astr,因此會改變astr的指向,但是並沒有改變原來方法外str的引用位址,

因此執行結果就可想而知,我們從分析過程就可以發現string作為引用型別,在按值傳遞過程中和其他引用型別是一樣的。如果需要完成changestr()呼叫後,改變原來str的值,就必須使用ref或者out修飾符,按照按引用傳遞的方式來進行就可以了,屆時astr = "changing string"改變的是str的引用,也就改變了str的指向。

4.按引用傳遞之ref和out

不管是值型別還是引用型別,按引用傳遞必須以ref或者out關鍵字來修飾,其規則是:

方法定義和方法呼叫必須同時顯示的使用ref或者out,否則將導致編譯錯誤;

using system;

namespace anytao.net.my_must_net._11_args

static void showinfo(ref string str) }

}當然,按引用傳遞時,不管引數是值型別還是引用型別,按引用傳遞時,傳遞的是引數的位址,也就是例項的指標。ref和out關鍵字將告訴編譯器,方法傳遞的是引數位址,而不是引數本身。

如果引數是引用型別,則按引用傳遞時,傳遞的是引用的引用而不是引用本身,類似於指標的指標概念。

C 引數傳遞詳解

引數傳遞看似很簡單的東西,但是真正理解它的本質卻並不很容易,在看過 你必須知道的.net 一書後,使我從本質上明白了引數的傳遞。值型別和引用型別的區別 值型別 value type 值型別例項通常分配在執行緒的堆疊 stack 上,並且不包含任何指向例項資料的指標,因為變數本身就包含了其實例資料。引...

C語言函式引數的傳遞詳解

開講之前,我先請你做三道題目。嘿嘿,得先把你的頭腦搞昏才行 唉呀,誰扔我雞蛋?考題一,程式 如下 void exchg1 int x,int y main 輸出的結果為 x y a b 問下劃線的部分應是什麼,請完成。考題二,程式 如下 void exchg2 int px,int py main ...

C語言函式引數的傳遞詳解

開講之前,我先請你做三道題目。嘿嘿,得先把你的頭腦搞昏才行 唉呀,誰扔我雞蛋?考題一,程式 如下 void exchg1 int x,int y main 輸出的結果為 x y a b 問下劃線的部分應是什麼,請完成。考題二,程式 如下 void exchg2 int px,int py main ...