网瘾少年带你学数组

某一天,当我遨游在游戏的世界中,费劲心思打死一只BOSS,满心欢喜的去检它的掉落物时,我看者自己已经爆满的背包陷入了沉思,我的被背包怎么就这么多垃圾....,啊,不对,是这个背包系统到底是怎么做出来的(我能不能自己修改一下),在我现在学过的知识中,我觉得应该与数组有关。

一维数组

概念

数组是一组相同元素的集合。

从这个定义中我们可以知道,数组可以有一个及以上的元素。数组中的元素类型是相同的。就像我们游戏的背包分为了好几种不同类型,有的专门存放武器,有的专门存放食物,还有的专门存放杂物等等,这些就是不同的数组只能存放相同类型的元素。

一维数组的创建以及数组类型

数组创建的基本形式是

type name[常量值] = { 元素 };

type是指类型,你要创建的数组内存放的元素的类型,就是你要存的东西是什么类型。比如 int , float, double等类型。

name是指你创建的数组的名字,这个名字是你自己定义的,是什么都行。

[常量值]是你要创建的数组的大小,也就是能存多少个元素。[20]就相当于能存20个元素。

就比如在我要创建一个数组来储存一下我现在有的角色的血量。

int HP[10] = {100, 200, 100, 100, 100, 100, 100, 100, 100, 100}

我有10个角色,然后血量就像上面的数组中显示的那样。

数组其实也是有类型的,数组的类型是去掉数组名的部分,在上面定义的数组中,它的类型应该是int [10] ,括号内的值不同,数组的类型不一样,前面的类型不同,数组的类型也不一样。就比如

int n1[10] //类型int [10]
int n2[11] //类型int [11]

int n1[10] //类型int [10]
char n2[9] //类型char [9]

这两个例子中,数组的类型均不相同。所以说数组相当于是一个自定义类型。

一维数组的初始化

初始化就相当于我们给变量初始化一样,用一些值去填充数组的值。数组的初始化要用到{},将想要初始化的值放在大括号内,同时每个元素之间要用逗号(,)隔开,表示不同元素。

当我们不知道数组内存放的元素是什么时同常先给数组赋值为0。

int HP[10] = {100, 200, 100, 100, 100, 100, 100, 100, 100, 100}

像这个数组中我是已经知道目前我的游戏角色都是多少血量,所以都能赋值,但如果我现在只有一个角色,我只知道一个角色的血量。

int HP[10] = { 100 };

我只给一个元素赋值了,但数组有10个空间,后面的元素的值是什么?

这其实叫做数组的不完全初始化,当我们没有给数组中每个元素都赋上值时,那些没有赋上值的元素会被自动赋值为0。我们用程序跑起来看看

再下面这张照片上,左侧这一栏是数组元素的下标,等会会讲,其实就是数组中的元素,从小到大排列,右侧是对应的数值。

我们可以看到只有我们赋值的第一个元素有值,后面的元素都被自动赋值为0。

当我什么东西都不知道时,我们可以将数值只赋值一个0。如果不进行初始化的化数值中会被自动填充为别的值,但不一定是0,所以对数组进行初始化是很有必要的

一维数组的下标及使用

我们上面提到了数组的下标,就是数组中的元素在创建好之后就会被按从左到右赋予下标,下标从0开始,直到数组的结束。我们以王者荣耀的装备栏来举例

我们假设装备栏就是一个数组,我们可以看到第一件装备的编号是0,依次往后。

char equip[20] = { '极', '影', '救', '赎', '鞋', '旭', '日', '不', '详', '破', '茧'};

这里为什么不把每件装备的名字写在一起,这是因为每件装备的名字其实相当于是个字符串,而数组只是一个字符数组,不能储存多个字符串,想要储存字符串,要涉及到二维数组,这个也会讲 

知道数组的下标后我们又该怎么使用这个数组中的元素呢?这就涉及到一个操作符中括号([]),其时中括号还有一个名字叫:下标引用操作符。

通过这个操作符,我们就可以来使用数组中的元素。例如我要打印第一个装备的名字,那我们就要引用这个装备名称的下标。

printf("%c%c", equip[0], equip[1]);

这样在形式上就可以调用第一件装备的名字,但是实际上你会发现打印的是乱码,我们的操作上是没有错误的,至于为什么,就留给你们自己去研究一下吧。

如果想要修改这个数组中的值的话,我们也是通过引用数组的下标,这样就可以达到想要的结果。

就比如我想要把数组中每个装备都改成字母a,那么我们就可以通过一个循环来实现

char equip[20] = { '极', '影', '救', '赎', '鞋', '旭', '日', '不', '详', '破', '茧'};
for (int i = 0; i < 20; i++)
{
	equip[i] = 'a';
}

通过不断改变i的值来引用数组内不同的内容,借此来改变数组。

二维数组

概念

以一维数组为数组元素的数组,在前面了解中都是以内置类型为元素的数组,而二维数组就是以一维数组为元素的数组。当然还有三维数组,就是以二维数组为元素的数组,三维及以上都被称为多维数组,不过我目前是没碰到过三维数组。

二维数组的创建

二维数组创建跟一维数组类似

type name[常量值][常量值] = { 数组元素 };

同样是先类型,然后数组的长度,最后大括号内是数组的元素。

二维数组可以理解为一个表格,第一个中括号内的数字是表格的行,第二个是表格的列。

int arr[2][3];

2表示这个数组有两行,3表示这个数组有三列。

二维数组的初始化

类似于一维数组的不完全初始化,我们可以只赋予一些值,然后数组会将这些值按顺序从第一行一直往下放,直到将值完全赋完,后面会全部赋0。

int arr1[3][3] = { 2, 3 };
int arr2[3][3] = { 0 };

左侧的图就是第一个数组初始化后的值,第二个图就是第二给数组初始化的值。

完全初始化完全初始化就是将整个数组都赋值,而其实二维数组有两种赋值方法。

第一种就是按按顺序来

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

 这样赋值,会按顺序将值依次放入数组中

第二中就是按行来赋值

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

这样赋值就会将第一个大括号内的元素填充到数组的第一行里面,第二个类似。

如果是用按行赋值来进行不完全赋值,那么某一行后面未赋值的元素也会被赋值为0。

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

 二维数组在初始化时可以省略行的值,但不能省略列的值,就是第一个中括号内的值可以省略,但第二个中括号内的值不可以省略。

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

这是因为在初始化的情况下,有数组的列,是可以将数组的行计算出来的。

在第一个数组中,数组有三列,而我们初始化的数值正好是三个,由此可以算出来数组的行是一行。而在第二个数组中只有两列,那么初始化超过的数会自动到下一行,但是又不足4个数,第二行不足的后面会补0。

二维数组的下标及使用

二维数组与一维数组一样,每个元素都有下标,就像一个表格一样,行和列是独立计算的,下标从0开始。

 我们还是以那个装备栏为例

char equip[6][20] = { "极影", "救赎", "急速鞋", "旭日", "不详", "破茧"};

还记得二维数组的概念吗,二维数组是以一维数组为元素的数组。上面的装备中,每一件装备的名字就是一个字符串数组,一共6件,所以二维数组的行就是一维数组的个数,而二维数组的列就是一维数组的长度。因为每件装备都是不同的数组,所以每件装备都在不同的列。

为了后面方便展示,我们把这些装备改成拼音的形式

char equip[6][20] = { "jiying", "jiushu", "jishu", "xueri", "buxiang", "pojian" };

如果我们想要打印这六件装备的名字,就只需要访问他们的下标就像,同样是使用下标引用操作符

printf("%c", equip[0][1]);

这就表示打印第一行第二列的那个元素,就是打印 i 这个字母。如果我们要打印全部的装备名字

for (int i = 0; i < 6; i++)
//产生行的下标
{
    int j = 0;
    //数组的列下标
    while (equip[i][j] != '\0')
    {
        printf("%c", equip[i][j]);
        j++;
        //使列下标变化
    }
    printf("\n");
    //打印完一件装备后换行
}

因为每个字符串都是以 \0 结尾,所以在第二个循环中,数组某行某列不等于 \0 为判断条件,同时在循环内部递增 j 的的值来改变数组的列。

字符串稍微有点复杂,我们再以一个整数数组为例。

int arr[2][3] = { 6, 6, 6, 6, 6, 6 };
for (int i = 0; i < 2; i++)
//产生行的下标
{
    for (int j = 0; j < 3; j++)
    //产生列的下标
    {
        printf("%d", arr[i][j]);
    }
    printf("\n");
} 

无论是要在数组内输入什么内容或者是输出数组内的内容,都要使用到数组的下标,只要知道下标就可以对数组进行各种操作。

  • 36
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值