//=====================================================================
//TITLE:
// C++ VS C#(5):數組
//AUTHOR:
// norains
//DATE:
// Monday 13-December-2010
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================
1. 數組
C++和C#都是用“[]”來表示數組,只不過不同的是,一個是在後,一個是在前,如://C++<br />int Age[] = {5};</p><p>//C#<br />int []Age = {5};<br />
如果要指定數組的大小,C++可以在“[]”中直接填入數字,而C#必須重新new一次,如://C++<br />int Age[10];</p><p>//C#<br />//int [10]Age}; 無法編譯通過<br />int[] Age = new int [10];//可以編譯通過<br />
另外,這兩者語言都可以指定數組的大小,但這裡有個區別,C#中數組大小必須要和元素個數相匹配,如://C++<br />int Age[10] = {5,10};</p><p>//C#,無法編譯通過<br />int[] Age = new int[10] { 5, 10 };<br />
C++能通過,是因為它可以自動給沒有賦值的元素自動給予0的數值,而C#則必須要一一指定,所以代碼只能這樣://C#,數組大小和元素個數相等,能夠編譯通過<br />int[] Age = new int[2] { 5, 10 };
在C++的時候,是不是經常碰到數組越界的情況?但在C#中,如果你只是想讀取數值,那麼使用foreach完全就可以不用擔心這個問題,如:int[] Age = new int[5] { 5, 10,1,2,3 };<br />foreach (int Val in Age)<br />{<br /> Console.WriteLine("{0}",Val);<br />}
這裡只需要注意一點,聲明的Val是唯讀,如果強行賦值會出錯,如:int[] Age = new int[5] { 5, 10,1,2,3 };<br />foreach (int Val in Age)<br />{<br /> Val = 5;//會出錯<br />}
如果要對數組進行賦值,就不能使用foreach,而只能是for了。
這兩種語言,都支援多維陣列,當然聲明就是大相徑庭了,以二維數組為例://C++<br />byte Array[2][3] = {{00,01,02},<br /> {10,11,12}};</p><p>//C#<br />byte[,] Array = {{00,01,02},<br /> {10,11,12}};<br />
C#的數組還有一個很有意思的特性,就是數組的數組,也就是很多教科書上所說的變長數組。多維陣列和變長數組的區別在於,前者以“,”分隔,而後者是以多個“[]”分隔,如:byte[][] Array = { new byte[10],<br /> new byte[20],<br /> new byte[30]};<br />byte Value = Array[1][10];
但在C++很多教科書裡,卻很少提到數組的數組這個詞語,是不是C++不支援呢?答案當然不是,因為數組的數組在C++裡其實也就是數組的概念,對於上面的C#代碼,C++中可以變更表示如下: byte* Array[] = {new byte [10],<br /> new byte [20],<br /> new byte [30]};<br />byte Value = Array[1][10];
為什麼C++裡面沒有特意的聲明變長數組的文法,但卻能實現C#的相應的功能呢?其實很簡單,並不是C++不能,而是C#不行。這個就要從指標說起,因為C#為了更安全,所以取消了指標這個遭人詬病的隱患,而C++的這個實現,其本質是儲存指標的數組,正因為如此,取消了指標的C#就不能使用聲明多維陣列的方式來實現變長數組,所以才會獨立出一個聲明變長數組的文法。