「和一维数组一样,二维数组同样有两种初始化方式,一种是一次性把所有数据都放进去,比如说这里的地图数据:
int map[8][8]={
{0, 0, 3, 3, 3, 0, 0, 0},
{0, 0, 3, 4, 3, 0, 0, 0},
{0, 0, 3, 0, 3, 3, 3, 3},
{3, 3, 3, 2, 0, 2, 4, 3},
{3, 4, 0, 2, 1, 3, 3, 3},
{3, 3, 3, 3, 2, 3, 0, 0},
{0, 0, 0, 3, 4, 3, 0, 0},
{0, 0, 0, 3, 3, 0, 0, 0}};
从这种表示方法也可以推断出老爹跟你说的,二维数组其实就是一个一维数组,只不过它的每个元素也是一个以为数组。
第二方式就是一个一个的往数组里面放数据,例如:
map[0][1]= 1;
代表的编号为0的小袋子里面的第一元素是1,以此类推。」
「那可不可以向大袋子里面一个一个的装小袋子呢?」
我突发奇想道。
「在C语言里面按照正规操作是不可以的哦!」
老爹意味深长地笑道。
「那非正规方式呢?」
我贼兮兮地问道。
「这个得等到你学了指针再说。」
老爹似乎早就知道我会有此一问,于是轻描淡写地就把我给打发了。
「哼!」
我斜着眼睛白了老爹一眼。
「既然已经说到了数组,那就顺带把字符串也给说了吧。还记得你写的第一个输出『hello world』的程序么?」
「当然记得咯!」
「那还记得『hello world』当时是放在什么符号里面的么?」
「双引号!」
我在心里默默地将hello world程序给写了一遍。
「准确的说是英文双引号,在C语言中,英文双引号就代表一个字符串,字符串中的内容就是双引号里面的内容,现在我们来研究一下『hello world』这个字符串。
char str[]=“hello world“;
猜猜上面这个字符数组str的长度是多少。」
「哼!事出反常必有妖,既然你让我猜,说明真实的长度绝对不是表面上数的那么多,按照字符数,长度本来应该是10。嗯……我猜11!」
我思索了一下,然后不怎么确定地报出了自己的答案。如果说是10,那肯定会错!
果不其然,老爹脸上露出了一丝惊讶的表情。
「居然被你蒙对了,其实上面的定义和这句代码等效:
char str[]={'h','e','l','l','o','','w','o','r','l','d','\0'};
最后一个字符叫做反斜杠零,是字符串的结束符。计算机一旦检测到这个字符,就算后面还有字符,也不会在进行相关操作了。
还有,这个反斜杠叫做转义符,用来启动或者关闭一些字符的特殊功能。」
「嗯?奥特曼的变身器?」
「可以这么理解,我举个例子吧,还记得反斜杠n么?这个时候反斜杠就启用了字符n的特殊功能——换行,于此相似的还有反斜杠b、t、r等,还有刚刚说到的反斜杠0。」
「上面的是开启特殊功能,那关闭怎么说呢?」
「刚刚说了,双引号代表的是一个字符串,也就是说,双引号是具有特殊意义,那如果我们需要在字符串中使用双引号怎么办?比如说要输出这句话:『Dad said:“C is very fun!“』。」
「哈哈,你都说了用反斜杠关闭它的特殊功能啊,多半就是这样了吧:
printf(“Dad said:\“C is very fun!\““);」
看着我敲出来的代码,老爹笑着拍了拍手。
「玥玥啊,你有没有发现在取数组元素的时候好像有点问题?」
老爹一边说,一边露出了他那让人抓狂的笑容。
一般老爹这么说,那肯定是意有所指。
「老爹你先前说无论是往数组里面放数据,还是从数组里面取数据,都要靠数组的编号,这样看来,的确可以把数组中的每一个元素都取出来。
但是如果数组的元素太多,一个一个的取也是一个很大的工程量啊。况且要一个一个的取的话,对于加载地图的时候完全没有帮助嘛!」
我脑袋飞速运转,开始分析当前存在的问题。
老爹满意地点了点头,然后说道:「分析得不错,那接下来就跟你说说混沌先民中掌握了轮回法则的两尊大神——for和while。」
「轮回法则?」
我眼睛一亮,从老爹的话中捕捉到了一些信息。
「不错,这两位可是有大能耐,当它们施展轮回法则的时候,会让它们所在的那片空间的时间停止,直到轮回法则结束。」
「听起来好有意思的样子!」
「既然如此,那么我们先用一个具体的小例子来说明它们的用法。
比如说现在我一个长度为1000的int型数组,需求是每一个元素的值就是它的在数组中的编号。
如果没有轮回法则的话,我们就只能这样:int arr[1000]={0, 1, 2, 3……,998, 999};
或者这样:
int arr[1000];
arr[0]= 0;
arr[1]= 1;
……
arr[999]= 999;
费劲不?」
「老费劲了!」
「但是有了for和while,我们就很容易就能做到了,先说for:
for(int i = 0; i < 1000; i++)
{
arr[i]= i;
}」
「这……这就完了?」
这回轮到我无语了,这相差也太大了吧?
「简单吧?现在来跟你说说这是什么意思。
for(轮回开始;轮回条件;轮回变数)
{
每次轮回执行的内容
}
当for轮回启动的时候,首先会执行轮回开始,在上面的例子中,我们在这个地方声明了一个名为i的int型变量,并为它初始化值为0。接下来for就会检查轮回条件,如果条件为真,它就要执行每次轮回都要做的事情,咱们这里向数组编号为i的元素赋值为i。此时i = 0,0当然是小于1000的,于是for执行轮回的内容,将编号为0(i = 0)的元素赋值为0(i=0)。
当每次轮回的事情做完后,for就要执行轮回变数,我们要它将i加1,所以这个时候i就从0变成了1。
接下来for又要去检查轮回的条件是不是满足,1小于1000成立,于是执行轮回内容:将编号为1(i = 1)的元素赋值为1(i=1),然后执行轮回变数, i从变成了2。
然后一直就是判断条件->执行内容->执行变数->判断条件……
直到i=999的时候。
当for执行完本次的轮回内容,即:将编号为999(i = 999)的元素赋值为999(i=999)后,再执行变数,i就从999变成了1000。
这个时候for再去判断轮回条件的时候,i等于1000并不小于1000,轮回条件不成立,结束轮回。」