而且C语言为我们提供了两种向口数组面放数据的方式,第一种是一次性放进去:
int arr[10]={0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9};
这样数组会根据右边大括号中的顺序按0到9对这10个数据进行编号,也就是说arr[0]等于0,arr[1]等于1,以此类推,arr[9]等于9。
使用这种方法甚至不用告诉计算机有多少个元素,它会根据大括号里面的内容去推断,所以说用下面这种写法也是可以的。」
int arr[]={0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9};
「这么看来,计算机也并不是完全是个智障嘛,还有一点推断能力。那另外一种放东西的方式是怎样的呢?」
我打趣道。
「哈哈,另外一种,就是一个一个的往里面放咯。就像这种:
int arr[10];
arr[0]= 0;
arr[1]= 1;
……
arr[9]= 9;
不过有一点要注意,如果要一次性把数据放进数组这个袋子里只有一次机会,就是在声明完成之前,像下面这种方式就是错误的,:
int arr[10];
arr ={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
在执行int arr[10];的时候,数组的声明就已经完成了。」
「好嘛,晓得了。」
我点了点头。
「那对于如何得到一个口袋这块有什么问题么?」
「嗯~,这个倒是没有什么。」
我摇了摇头,然后接着说道:「我在想,如果把刚刚你说的那个地图数据用一个数组把它装起来倒是没有问题,不过好像要得到行号和列号就有些困难了。」
我蹙眉苦思道。
「我们依然用刚刚那个地图数据来说明:
编号_行号_列号 0 1 2 3 4 5 6 7
00____0_______0 0 3 3 3 0 0 0
08____1_______0 0 3 4 3 0 0 0
16____2_______0 0 3 0 3 3 3 3
24____3_______3 3 3 2 0 2 4 3
32____4_______3 4 0 2 1 3 3 3
40____5_______3 3 3 3 2 3 0 0
48____6_______0 0 0 3 4 3 0 0
56____7_______0 0 0 3 3 0 0 0
在左边我标出了每一行第一个元素在数组中的编号以及行号,在上方我标出了列号,你能够看出行号和列号与数组编号的关系吗?」
「行号等于每一行第一个元素的数组标号除以8!列号等于数组编号减去每一行第一个元素的数组编号!」
我惊奇地叫到,仿佛发现了新大陆。
「虽然不是完全正确,但是已经接近真实答案了!再观察一下呢!说不定就发现规律了哦。」
老爹笑了笑。
「嗯……」
我咬着左手拇指指甲,睁大眼睛盯着着屏幕上老爹打出来的这些数字,想从其中找出点什么规律来。
在这个过程中,老爹一直没有打扰我。不过我始终不得要领,直到把指甲咬碎了一块也没有从中看出什么规律来。
「老爹,我没有看出其他规律了……」
我眼巴巴地望向了老爹,只能向他求助了。
「其实你刚刚已经说得很相近了,就差那么一点点。不过没关系了,毕竟以前你没有接触过这方面的,能够一下子就找到先前的规律已经很不错了。
其实元素在数组中的编号=行号x 8 +列号,你看看是不是?」
「咦,还真是这样!」
「所以啊,反过来的话,行号就等于数组编号对8做整除,列号等于数组编号对8取余数。有时候我们在考虑一件事情的时候,如果暂时没有答案,不妨换一个角度。」
「嗯!」
随机挑了几个元素将老爹说的规律验算了之后,我这才心悦诚服地点了点头。
「其实还有更简单的方法。」
就在这时,老爹又笑着抛出了一个深水炸弹。
「……老爹,你真的是名副其实的坑闺女啊,既然有简单的,为什么要绕这么大的圈子呢?」
我无语道。
「别先记着抱怨,一会儿等我说完了你可能就知道为什么了。」
「那好吧~」
我拖长了声音,发出了自己的抗议。
「好,我接着买薯片的案例。
就在我们刚从超市出来的时候,你妈妈给我打了一个电话,说赵叔叔来我们家做客了,让你给赵叔叔的女儿灵筠也买几包薯片,当然了,还要给她带几包,于是我们又回超市买薯片。
因为你妈妈喜欢吃香焗番茄味道的薯片,而灵筠喜欢吃香烤原味,你喜欢吃的是红酒牛排味的薯片,为了方便区分,于是你向收银小姐姐要了两个口袋,将香焗番茄味和香烤原味的薯片分别放到了不同的口袋中,这样我们这儿就有三个口袋,分别是红酒牛排味、香焗番茄味和香烤原味。
三个口袋提在手上很不方便,好在出门之前奶奶给了老爹一个布袋子,于是你就将这三个口袋一起放到了布袋当中。」
「嗯,然后呢?这个不是很正常么?」
我点了点头,毫不在意地问道。
「问题的关键就在这里,我之前跟你说过,数组其实就是一个口袋,只是它会给口袋里面的东西编号。
既然现实中口袋里边能够再装口袋,那么C语言中呢?
设想一下,如果我们把地图的每一行数据都放到一个口袋(数组)里面,这样就会有8个口袋(数组),然后我们再用一个大口袋(数组)把这八个口袋(数组)装起来,这样大口袋中对小口袋的编号不就是行号么,每个小口袋里面的元素编号不就是列号了么?
这样一来,获取行号和列号就十分简单了,不需要进行计算。」
「居然还有这种好东西,那C语言中是如何表示那个大口袋的?」
我眼睛一下子亮了,如果真有这个东西的话,的确要省事很多。
「在说大口袋之前,要先给你介绍一个概念,也就是数组的维度。像我之前说的那个直接装薯片的口袋,也就是在C语言中直接装某种数据类型的数组,比如说:int array[10],char array[10],double array[10]这样的被叫做一维数组。
而刚刚说的大袋子,也就是里面放着小袋子的数组,在C语言中则是一个数组里面装的一维数组,这样的数组就叫做二维数组。通过我们刚刚的分析,二维数组特别适合用来保存具有行和列这样的表格数据。
二比如说我们要定义一个4行3列的int型二维数组,那么就是这样的:int[4][3]。其实按照我们装薯片的方式来解释更容易明白,定义一个大袋子,可以装4个小袋子,然后每个小袋子里面装了三包薯片。
有一点是需要注意的,那就是无论是大袋子还是小袋子要装几个元素必须在定义的时候指定清楚,否则编译器就会报错。」
「哦~,原来是这样啊。那三维数组是不是一个超级大袋子,里面装了几个大袋子,然后每个大袋子里面又装了几个小袋子,每个小袋子里面装了几包薯片。按照一维数组、二维数组的规律来看,三维数组的表示方法应该就是:int[4][5][6]这种了吧?」
我摸着下巴推断道。
「完全正确!其实从本质上来看,无论几维数组,其实都是一维,只是元素的类型不同罢了。三维数组的元素类型是二维数组,二维数组的元素是一维数组,一维数组的元素是具体的数据。不过为了方便理解才引入了维度这个概念,而且大家都是这么描述数组的,所以我们也就沿用吧。」
老爹摸了摸我的头,笑着说道。