c 中的傳值和傳位址學習(2)

2021-04-13 08:39:38 字數 1770 閱讀 4871

using system;

class element

class test

static void main() }

程式經編譯後執行輸出:

10 100

我們看到即使傳值方式仍然改變了型別為element類的物件t。但嚴格意義上講,我們是改變了物件t的域,而非物件t本身。我們再看下面的例子:

using system;

class element

class test

static void main() }

程式經編譯後執行輸出:

10 10

傳值方式根本沒有改變型別為element類的物件t!實際上,如果我們能夠理解類這一c#中的引用型別(reference type)的特性,我們便能看出上面兩個例子差別!在傳值過程中,引用型別本身不會改變(t不會改變),但引用型別內含的域卻會改變(t.number改 變了)!c#語言的引用型別有:object型別(包括系統內建的class型別和使用者自建的class型別--繼承自object型別),string 型別,inte***ce型別,array型別,delegate型別。它們在傳值呼叫中都有上面兩個例子展示的特性。

在傳值和傳址情況下,c#強制要求引數在傳入之前由使用者明確初始化,否則編譯器報錯!但我們如果有乙個並不依賴於引數初值的函式,我們只是需要函式返回 時得到它的值是該怎麼辦呢?往往在我們的函式返回值不至乙個時我們特別需要這種技巧。答案是用out修飾的輸出引數。但需要記住輸出引數與通常的函式返回 值有一定的區別:函式返回值往往存在堆疊裡,在返回時彈出;而輸出引數需要使用者預先制定儲存位置,也就是使用者需要提前宣告變數--當然也可以初始化。看下 面的例子:

using system;

class test

); firstname=strarray[0];

lastname=strarray[1];

} public static void main()

, my last name: ",

myfirstname, mylastname);

} }

程式經編譯後執行輸出:

my first name: cornfield, my last name: lee

在函式體內所有輸出引數必須被賦值,否則編譯器報錯!out修飾符同樣應該應用在函式宣告和呼叫兩個地方,除了充當返回值這一特殊的功能外,out修 飾符ref修飾符有很相似的地方:傳址。我們可以看出c#完全擯棄了傳統c/c++語言賦予程式設計師莫大的自由度,畢竟c#是用來開發高效的下一代網路平 臺,安全性--包括系統安全(系統結構的設計)和工程安全(避免程式設計師經常犯的錯誤)是它設計時的重要考慮,當然我們看到c#並沒有因為安全性而喪失多少 語言的效能,這正是c#的卓越之處,「sharp」之處!

陣列引數也是我們經常用到的乙個地方--傳遞大量的陣列集合引數。我們先看下面的例子:

using system;

class test

return s;

} static void main()

; console.writeline("the sum:"+sum(var));

console.writeline("the sum:"+sum(10,20,30,40,50));

} }

程式經編譯後執行輸出:

the sum:15

the sum:150

可以看出,陣列引數可以是陣列如:var,也可以是能夠隱式轉化為陣列的引數如:10,20,30,40,50。這為我們的程式提供了很高的擴充套件性。

C 傳值和傳位址

1 交換變數x和y的值 void swap int x,int y int temp temp x x y y temp cout int a 5 int b 10 int x 1 int y 2 void swap int x,int y int a 5 int b 10 int x a int ...

傳位址和傳值

using system using system.data using system.configuration using system.collections using system.web using system.web.security using system.web.ui usin...

C 學習 (02)傳值 傳引用 傳位址

include using namespace std class complex 內聯函式 inline int imag const complex operator complex n complex complex int r 0,int i 0 re r im i 建構函式的初始化列表 c...