b5纸16开是多大:C#数组的问题

来源:百度文库 编辑:高校问答 时间:2024/04/29 04:49:53
double [][]shapes=new double[4][];
shapes[0]=new double[1]{10};//圆
shapes[1]=new double[4]{3,4,3,4};//四边形
shapes[2]=new double[3]{3,4,5};//三角形
shapes[3]=new double[5]{5,5,5,5,5}; 五边形

这是怎么个意思
我看不懂
哪位帮忙解释一下
越详细越好
谢谢

shapes是一个数组,它有几个元素,它的元素也是数组

本人对double有偏见,所以换用int
用我自己的代码帮你解释吧

int[]i0=new int[]{321};
int[]i1=new int[]{321,654};
int[]i2=new int[]{321,654,987};

int[][]shapes=new int[3][];
shapes[0]=i0;//从这样的存取方式看来,iis也是个一维数组
shapes[1]=i1;
shapes[2]=i2;
shapes其实是一个一维数组,它里面存放的元素也是数组,例如,在这里shapes[2].Length就和i2.Length一样是3
而shapes[2]所存取到的事实上也就是i2,那么shapes[2][2]所存取到的就是i2的第(2+1)个元素

shapes
+-i0--{321}
+-i1--{321,654}
+-i2--{321,654,987}
上面这个图表示了shapes,shapes是一个一维数组,它有三个元素,那三个元素的值分别是i0,i1,i2,而i0,i1,i2自己也是数组
shapes[0]通过这个样子存取到的是shapes的第一个元素,首先就告诉你了,shapes的元素也是数组,所以shapes[0]=i0这个语句是合法的,因为shapes[0]是一个int数组,而i0也是一个int数组,就是这么回事儿~
所以经过我上面那几行代码之后
Console.WriteLine(shapes[2].Length);
这句代码会输出3,也就是i2的长度(i2有3个元素嘛!)
当然,在这句代码之后:int[][]shapes=new int[3][];
你可不能直接使用shapes[0]~shapes[2]呀,因为shapes那三个元素的值还没有被初始化,还是null,你如果使用了那个为null的元素,就会导致程序发出异常
另外,在声明上面shapes那种数组的时候,还有几点要注意
int[][][]isss=new int[3][][];
这样声明也是可以的,或者说,"[]"的个数可以无限多
对于上面声明的isss,它是一个一维数组,它的每个元素也应该是一个一维数组,而且它的元素所拥有的元素也是一维数组
你也知道,数组的长度不可以改变,所以我们在使用new声明的时候,要么你使用大扩号把它的元素一个一个都弄清楚了,否则你就得把数组的大小给规定好
int[]iss=new int[];//错误,没有设定大小
int[]it=new int[321];//OK
int[]asd=new int[]{321,654};//正确,因为使用大扩号把每个元素都初始化了,那么asd的长度为2
int[]asdf=new int[2]{321,654};//OK,两个一起来,只要前后对称就行
int[][]aa=new int[][];//错,没规定大小
int[][]aaa=new int[36][];//OK
int[][]aaaa=new int[][3];//错误,aaaa是一维数组,应该在第一个[]中规定它的大小

上面说的是一维数组,现在跟你说说多维数组
int[,]a=new int[2,3];
上面声明的就是一个2*3的二维矩型数组,在存取它的值的时候:a[x,y]=***;***=a[x,y];
声明n维数组,那么[]里就应该有n-1个",",而在使用new初始化之的时候,你必须对它的每一个维的大小全部都制定,例如这样的声明就是错误的:
int[,,]aa=new int[3,2,];//只规定了两个维的大小,还有一个维的大小没有规定

现在,我先声明一个2维数组:
int[,]ars=new int[5,6];
如果看不到上面这个句子,我们如何知道ars第1\2维的长度呢?ars.Length吗?不对,ars.Length返回的是它的总长度,是5*6=30,要取得第n+1维的长度,可以这样做:
ars.GetLength(int n);这个方法返回的就是第n维的长度啦,例如:
int len2=ars.GetLength(1);//len2=6,这里返回的是第二维的长度,而如果用ars.GetLength(0);则会返回第一维的长度,因为它是以0为基准进行计量的,跟数组的下标规则一样

我想他的本意应当是:
为(doouble **)指针shapes分配四个指向double型的指针空间。
然后为每个指针分配一个数组,并初始化。
[shapes]-->[ ][ ][ ][ ]//这里每个框内空间是sizeof(double*)
|
[ ]//这里每个框内空间是sizeof(double)
[ ][ ][ ][ ]
[ ][ ][ ]
[ ][ ][ ][ ][ ]

double [][]shapes=new double[4][]; //建立一个二维数组指针, 其中每个指针单元指向的都是一个二维数组
shapes[0]=new double[1]{10};//圆 , 上面二维数组指针的第一个数组单元是一个二维数组
shapes[1]=new double[4]{3,4,3,4};//四边形 , 第一行二维数组指针的第二个数组单元是一个二维数组
shapes[2]=new double[3]{3,4,5};//三角形 , 第一行二维数组指针的第三个数组单元是一个二维数组
shapes[3]=new double[5]{5,5,5,5,5}; 五边形, 第一行二维数组指针的第四个数组单元是一个二维数组

至于{5,5,5,5,5}, 是其中一维的显式赋值,隐式指定一维数组的大小.

你好,我在这里做一下初步的简单的回答,上面两位大概是学c或c++的,一些解释不太准确,这种结构是c#中新加入的,叫做锯齿形数组(jaggered array),不是一般的二维数组,这种数组的特点在于各行元素的个数不一定相同。所以声明和赋值操作就不同了,在c#语言中,是没有指针的,取尔代之的是句柄,句柄你可以把它当作一种指针看,但是它不是指针。句柄是一种很有价值的技术,但是学语言的时候理解不了它的作用的,只有有过c++开发应用才会有更深的理解。另外补充一点在c#中,二维数组声明时用的[,]语法格式。我不知道你明白多少,有问题再问我,我不知道你的基础,说了过多了。

C#中定义数组与C++不同
C++
int a[100][100];

而C#
int[][] a;
若制定大小
int[][] a=new a[100][100];

double [][]shapes=new double[4][];
//声明一个4行n列的double型shapes二维数组
shapes[1]=new double[4]{3,4,3,4};//四边形
//声明数组shapes的第1行为一个含有4个元素的double
//一维数组并对其赋值分别为3,4,3,4
//其余相同