//=====================================================================
//TITLE:
// C++ VS C#(5):数组
//AUTHOR:
// norains
//DATE:
// Monday 13-December-2010
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================
1. 数组
C++和C#都是用“[]”来表示数组,只不过不同的是,一个是在后,一个是在前,如://C++ int Age[] = {5}; //C# int []Age = {5};
如果要指定数组的大小,C++可以在“[]”中直接填入数字,而C#必须重新new一次,如://C++ int Age[10]; //C# //int [10]Age}; 无法编译通过 int[] Age = new int [10];//可以编译通过
另外,这两者语言都可以指定数组的大小,但这里有个区别,C#中数组大小必须要和元素个数相匹配,如://C++ int Age[10] = {5,10}; //C#,无法编译通过 int[] Age = new int[10] { 5, 10 };
C++能通过,是因为它可以自动给没有赋值的元素自动给予0的数值,而C#则必须要一一指定,所以代码只能这样://C#,数组大小和元素个数相等,能够编译通过 int[] Age = new int[2] { 5, 10 };
在C++的时候,是不是经常碰到数组越界的情况?但在C#中,如果你只是想读取数值,那么使用foreach完全就可以不用担心这个问题,如:int[] Age = new int[5] { 5, 10,1,2,3 }; foreach (int Val in Age) { Console.WriteLine("{0}",Val); }
这里只需要注意一点,声明的Val是只读,如果强行赋值会出错,如:int[] Age = new int[5] { 5, 10,1,2,3 }; foreach (int Val in Age) { Val = 5;//会出错 }
如果要对数组进行赋值,就不能使用foreach,而只能是for了。
这两种语言,都支持多维数组,当然声明就是大相径庭了,以二维数组为例://C++ byte Array[2][3] = {{00,01,02}, {10,11,12}}; //C# byte[,] Array = {{00,01,02}, {10,11,12}};
C#的数组还有一个很有意思的特性,就是数组的数组,也就是很多教科书上所说的变长数组。多维数组和变长数组的区别在于,前者以“,”分隔,而后者是以多个“[]”分隔,如:byte[][] Array = { new byte[10], new byte[20], new byte[30]}; byte Value = Array[1][10];
但在C++很多教科书里,却很少提到数组的数组这个词语,是不是C++不支持呢?答案当然不是,因为数组的数组在C++里其实也就是数组的概念,对于上面的C#代码,C++中可以变更表示如下: byte* Array[] = {new byte [10], new byte [20], new byte [30]}; byte Value = Array[1][10];
为什么C++里面没有特意的声明变长数组的语法,但却能实现C#的相应的功能呢?其实很简单,并不是C++不能,而是C#不行。这个就要从指针说起,因为C#为了更安全,所以取消了指针这个遭人诟病的隐患,而C++的这个实现,其本质是存储指针的数组,正因为如此,取消了指针的C#就不能使用声明多维数组的方式来实现变长数组,所以才会独立出一个声明变长数组的语法。