澳门新葡萄京娱乐场C#数组-一维数组

C# 是没有动态数组的,要实现动态数组的功能,请使用
Array、ArrayList、List。

  • C#数组-一维数组
  • C#数组-二维数组、多维数组
  • C#数组-交错数组

C语言的数组

但 C# 3.0 中确实有一种情况是不需要指定数组长度的,如下的代码,int[]
中括号中并没有指定长度,而是在后面大括号中指定了三个数值,这三个数值表示数组有三项,这三项的值分别是:1、4、7。


数组声明的实例:int num[3];只要记下这个模板就好。

int[] arr = new int[] { 1, 4, 7 };

  • C# 数组中每个元素的类型必须相同
  • C# 数组的下标是从 0 开始
  • C#
    中没有动态数组
  • C# 中支持多维数组

不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错


注意:如果定义的同时进行初始化,那么元素的个数可以省略
省略之后,初始化赋值几个数据,那么数组的长度就是几,也就是说数组将来就能存储几个数据。
int scores[] = {1,3};//只有两个存储空间了
澳门新葡萄京娱乐场 ,如果没有进行初始化,就不能省略元素个数:
    错误的:int scores[];

声明数组并赋初值

可以通过[]索引指定赋值
int scores[100] = {[87] = 1,[34] = 29};

int[] arr = {1, 2, 3};

获得数组的长度可以用sizeof

可以看出 [] 跟在类型名之后表示是个数组,{}
表示要赋的初值列表,各个初值之间用英文逗号隔开。

1 #include <stdio.h>
2 
3 int main(int argc, const char * argv[]) {
4     
5     int a[5];
6     printf("数组的长度:%in",(int)(sizeof(a)/sizeof(a[0])));
7     return 0;
8 }

声明数组

当数组名作为函数参数时,
因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数

int[] arr = new int[3]; //正确,声明一个长度为 3 的 int 类型数组
int[3] arr2; //错误,不能这样指定数组大小
int[] arr3; //没有指定数组大小,无法使用

1 void printArray(int array[])
2 {
3   printf("printArray size = %lun", sizeof(array)); // 8
4   int length = sizeof(array)/ sizeof(int); // 2
5   printf("length = %d", length);
6 }

如果我们事先不知道数组的值,我们可以按上述方法先声明数组,当然声明数组时应该知道数组的类型和大小,[]
中的数字表示长度不是下标的上界。

小何说两句:
    1.看样子,在C语言中无法将动态计算数组长度的方法模块化编程
    2.在java中中的数组是可以这样的:
        public class Main{
        public static void main(String[] args){
            int n = 10;
            int a[] = new int[n];
            System.out.println(a.length);
        }
     
但是在C语言中,是不能用变量如上面Java代码这样可以动态指定数组声明时的长度的。
        int a = 10;
        int b[a];
      但是在java语言中,数组的声明不能指定长度,也就是不能这样int[3]
a或者int a[3],java只能在初始化的时候指定数组长度。

C# 数组也支持动态指定

      在C++中声明数组也是和C语言一样的,声明格式:
      数据类型 数组名[常量表达式] 例如:int
array[10];常量表达式中可以包括整型常量和整型表达式,但不能是变量。
      C++和C语言不允许对数组的大小作动态定义。

int len = 3;
int[] arr = new int[len];

      在Swift和Objective-C中,数组的长度是动态可变的。
    3.但是C语言在访问数组的时候,指定索引可以用变量来指定。比如;
        int a[3]={1,2,3};
        int n = 2;
        printf(“%dn”, a[n]);

数组的赋值取值

小何说两句习题的一个知识亮点:
虽然这是一个很简单的习题,但是其中的小思想是可以积累的。
##1.设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值

int[] arr = new int[3];
arr[0] = 10; //给第一个元素赋值
int m = arr[0]; //取第一个元素的值

 1 int getMax(int ages[], int length)
 2 {
 3 //    注意:不要假设数组以外的值位最大值,会出现意想不到的问题
 4 //    int max = 0;
 5 //    假设数组中的第0个元素是最大
 6     int max = ages[0];
 7 
 8     for (int i = 0; i < length; i++) {
 9 //        判断从数组中取出的值是否大于max
10         if (max < ages[i]) {
11 //            如果大于max就把当前索引对应的元素设置成最大值
12             max = ages[i];
13         }
14     }
15 
16     return max;
17 }

获取数组长度

 

int[] arr = new int[3];
int len = arr.Length;
int len2 = arr.GetLength(0)
//这种方法也可以获取数组长度,参数表示要获取第几维的数组长度,从 0
开始

 1 int getMax(int ages[], int length)
 2 {
 3 //    把数组中的第0个索引作为最大值
 4     int max = 0;// 是一个索引
 5     for (int i = 1; i < length; i++) {
 6         if (ages[max] < ages[i]) {
 7             max = i;
 8         }
 9     }
10     return ages[max];
11 }

.NET Framework 3.5 下应用更方便

前面一个算法,也是我开始的思路,不过我采用三元运算符替代了条件语句,虽然代码看起来精简,但是本质上没有啥改变。
然后我看到第二个算法,相比第一个算法思想,就是直接面向最大值编程,而第二个算法是面向最大值的索引编程,也就是说,如果这个值是最大的,那我就操作这个值得索引好了,反正通过索引就一定能够得到这个最大值。
不过第二种面向索引写算法的思想一般用在这种集合元素不变动的情况,如果集合在算法中变动的话,就有可能出现通过索引获取不正确的值。

在 .NET Framework 3.5 下使用的是 C# 3.0
语法,所以使用数组更方便,可以不指定长度,而直接赋值。

好,阅读到这里,不管读者是重新阅读这段内容还是第一次阅读这段内容都尝试着不看源代码自己面向索引写这个小题的算法吧。
以下就是作者的练习代码:

string[] colors = new string[]{“#333”, “#666”, “#999”, “#ccc”,
“#fff”};

 1 #include <stdio.h>
 2 
 3 //设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值
 4 //面向元素具体值写算法
 5 int arrayMax(int a[],int count)
 6 {
 7     int max = a[0];
 8     for (int i=0; i<count; i++) {
 9         max = (max>a[i])?max:a[i];
10     }
11     return max;
12 }
13 
14 //面向索引写算法
15 int arrayMax2(int a[],int count)
16 {
17     //定义一个最大值的索引,比如这里的最大值索引是数组中的第一个
18     int max = 0;
19     
20     for (int i=0; i<count; i++) {
21         max = (a[max]>a[i])?max:i;
22     }
23     return a[max];
24 }
25 
26 int main(int argc, const char * argv[]) {
27     int a[5] = {12,2,2,3,23};
28     printf("最大值是:%dn",arrayMax2(a,5));
29     return 0;
30 }

声明一个数组
colors,并将五个字符串赋给它。这里数组的长度由大括号中的个数自动决定。

面向索引值写的算法在集合类的使用中可以起到减少算法空间复杂度的作用。
因为索引所占的空间往往就是int的所占的空间。

相关阅读

 

  • 请参见 MSDN
    的一维数组(C#).aspx)
  • 认识 C# 的
    ArrayList
  • 使用 C# 的
    ArrayList
  • C#
    中如何创建对象数组?
  • C# []、Array、List、ArrayList
    区别简介

  • C#数组-一维数组

  • C#数组-二维数组、多维数组
  • C#数组-交错数组

发表评论

电子邮件地址不会被公开。 必填项已用*标注