首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【小雨学编程之C#】18.7 复杂数据类型-数组

之前的内容中我们学会了简单数据类型,我们可以使用简单数据类型来表示现实生活中的事物,比如学生名字、学生成绩。

但是,在大量编程过程中,我们发现,如果对应数据过多的话,会对我们代码的编写造成困扰。

比如,一个班级有6个学生成绩分别为30、33、50、70、80、81,我们可以这样写:

int a1=30;

int a2=33;

int a3=50;

int a4=70;

int a5=80;

int a6=81;

将这些成绩分成两组,一组30、33、50;一组70、80、81,我们用代码可以这样写:

int a1=30;

int a2=33;

int a3=50;

int b1=70;

int b2=80;

int b3=81;

虽然我们用程序是实现了对应的要求,但是大家会发现两件事:

1、我们一直在重复的写代码

2、对应的数据每一个都是一个个体,并没有体现出是有关系的,比如6个学生是一个班级,但是我们在第一种写法中只看到了6个变量;比如将6个成绩分成两组,我们在第二中写法中也只看到了6个变量,只是我们在变量命名过程中做了点文章,让他们看起来好像是分组了,但是这些数据仍然都是个体,彼此之间没有关联关系。

这种关系,有些像,我们去超市买鸡蛋,我们会看到这样的景象:

这种情况就如同我们的普通变量,都是一个个的个体,相互没有关联性。这时候我们首先想到的是这么多的鸡蛋,我们怎么买呢?买哪几个呢?用什么装呢?这种心理和在代码中遇到一堆的变量心情是一样的。

但是:

商家很聪明,他们将10个鸡蛋放入一个盒子中,让鸡蛋组团出卖,这时我们就发现了,这组团的鸡蛋彼此就有关联了,它们可以一并卖出,并且我们不用考虑购买方式和运输方式了。

就如同组团的鸡蛋一样,为了解决零散变量给我们带来的困扰,C#提供了一种稍微复杂的数据类型来处理它们:数组。

所谓数组,就是一堆数据,但是这一堆数据是有要求的:

1、这堆数据一看就是一个整体

2、这堆数据的数据类型都是相同的

简称:一组同类型的数据元素

数据类型的声明:

和使用简单数据类型一样,我们使用它之前先要对其声明,声明的语法:

数据类型[] 数组名;(注:类型后面的是中括号或者方括号)

比如我们声明一个数组,存储学生的名字

string[] names;

比如我们声明一个数组,存储学生的成绩

int[] scores;

我们注意到声明数组和声明简单数据类型的区别就是,声明数组的时候,数据类型后面多了一个[]。

也就是说,我们要告诉计算机,我们要声明一个数组,但是可能系统中有很多数组,为了方便区分,我们声明数组的同时,给这个数组起一个名字,并且声明的同时,告诉计算机,我的这个数组专门存储哪一种类型的数据。

数据类型的初始化:

数组的声明只是告诉了计算机,在这个位置上,有一个使用数组的事情要发生,那么接下来就是要为这个数组指定元素的类型和数量,也就是数组的初始化。

1、指定数组的大小

int[] scores;

scores=new int[4];

2、也可以声明的同时初始化

int[] scores=new int[4];

3、也可以在初始化的同时给数组赋值

int[] scores=new int[4];

咦?不是已经对数组初始化了吗?怎么还有赋值一说呢?这个位置怎么把初始化和赋值拆开了呢?

这时有些小伙伴会对第三种初始化方式产生疑问,所以在这里我们要强调一下,数组的初始化,和简单数据类型的初始化是有区别的,简单数据类型的初始化,比如:

int i=1;

意思是声明了一个整形的变量,同时给这个变量赋值1,这个赋真实值就是对这个变量的初始化。

但是数组就不一样了,对于数组来说,声明数组是告诉计算机,“在程序的对应位置我们需要使用一个数组”这件事,就像我们说嘿!明天我们去超市买鸡蛋吧,一样,只是一件事情。

但是数组初始化是告诉计算机,你要为我需要的这个数组分配多少空间。注意这里的初始化仅仅是分配空间而已。

就如同卖鸡蛋的商家,提前给我们提供一个可以装10个鸡蛋的盒子一样,仅仅提供盒子而已。

但是像数组中填真实值和向盒子中装鸡蛋一样,都是我们在使用这个数组,并不是初始化。

4、如果数组初始化的同时给数组赋值,也可以不指定数组的大小,因为编译器会依据给赋的值,自动计算元素个数

int[] scores=new int[];

这种写法有简写方式

int[] scores=;

这里还需要注意最后一点,我们向数组中添加对应真实数据的时候,添加数据的格式和我们使用简单数据类型赋值的格式是一样的。

比如初始化字符的时候

char a=‘a’;

如果初始化一个字符数组

char[] letters={'a','b','c'}

数据的调用:

那么声明并初始化数组后,我们怎么使用呢?

虽然我们用数组表示了一组同类型的数据元素,但是这也是一堆数据,我们怎么在数组中区分这些数据呢?这个大家不用着急,其实在数组初始化的时候,系统就自动依照我们向数组添加真实值的顺序对数组中的元素进行了编号,但是需要我们注意的是,我们生活中给事物编号是从1开始,但是数组编号是从0开始,也就是说数组中第一个元素编号0,第二个元素编号1

比如int [] scores=;

在这个数组中

第一个元素56的编号是0

第二个元素77的编号是1

第三个元素47的编号是2

这里的编号我们又叫做索引,那么我们在使用对应数组的元素的时候就直接用

数组名[索引]的方式提取对应的数据

比如我想取出score中的88这个数据,那么我们就使用scores[3]即可

那么这里就又引出了给数组赋值的另一种方式,直接使用索引给数组赋值,比如:

int [] scores=new int[4];

scores[0]=1;

scores[1]=2;

scores[2]=3;

scores[3]=4;

但是在这里,小伙伴们会经常犯一个错误,因为我们的索引是从0开始的,所以索引的最大值是数组元素个数-1,但是由于我们平时生活中索引计数方式和程序索引计数方式的不同,小伙伴们会经常错误的将程序索引的最大值当作数组元素的个数,也就是:

int [] scores=new int[4];我们会错误的将它的最后一个索引认为成scores[4]

那么很明显,scores[4]是表示scores中第五个索引,但是在这个数组中没有第五个值,这时候,系统会抛出一个异常:

就是在告诉我们,我们使用了错误的索引值,调用了不存在的元素。这个错误很常见,需要引起大家的注意!

数组会偷着初始化的同时向数组中塞默认值!

学会了数组的使用的调皮小伙伴会产生一个疑问,既然数组的初始化只是告诉计算机给数组分配空间,但是分配空间后并没有对其赋值,那么这时候的数组里面存储的是什么呢?

比如 int[]a=new int[10] 我们随意调用数组元素,比如a[2]会发现系统并没有报错,而是显示0,这是怎么回事?既然目测看不出什么名堂,我们就开启调试模式看看这时候,内存中到底有什么,我们在输出位置打一个断点,然后运行:

我们看到此时内存中的scores中存储的都是0,那么我们将int换成double再看看:

这时候scores中存储的也是0,我们换成string再看看:

换成char再看看:

换成bool再看看:

于是我们得出结论,数组初始化后,系统会给对应数组每个元素依照数据类型的不同赋默认值:

数值型数组默认值是0

字符串型数组默认值是null(null在内存中表示空的意思,也就是没有引用任何东西的意思,后面的知识点中会介绍)

字符型数组默认值是空字符

布尔型数组默认值是false

最后需要强调的是,C#数组不支持动态数组,也就是当数组声明初始化后,其中元素的个数就固定了,不能在程序运行过程中随意修改!

屏幕前的小伙伴你们学会了吗!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210323A059BD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券