数组
讨论一个问题:
这段代码运行的结果和我之前预料的有出入,运行之前预测输出:3,3,3,3运行的正确结果是:4,3,3,15.为什么会这样呢,首先arr1这种定义方式,我们会存储四个字节的内容:a,b,c,\0因此当我们使用sizeof的时候,会得出arr1占用的字节数4个字节。arr2定义后会存储3个字节的内容:a,b,c使用sizeof会算出占用3个字节。
此时我们用strlen,它的计算方式完全不同,他从第一个字符计数,遇到\0停下并且算出 \0之前有多少字符,对于arr1计算结果为3,对于arr2它不知何时才会碰到\0而停止计算,因为c后面的值我们不能确定,因此15实际上时随机值。
数组的使用
对于数组的使用我们之前介绍了一个操作符:[],下标引用操作符,它其实就是数组访问操作符。
- 数组时使用下标来访问的,下标是从0开始的
- 数组的大小可以通过计算得到
练习:输出打印一个整型数组各个元素的地址编号:
运行结果:
定义二维数组时,列一定不能省略,行可以省略。我们访问二维数组的时候行数和列数仍然是从0开始。
尝试定义并输出打印二维数组的所有元素:
运行结果:
我们尝试打印输出二维数组每一个元素的地址:
可以看到,二维数组本质上使用的内存空间依然是连续的一段线性存储空间。只是在我们假想的结构上是i行j列的。我们在实际运用的过程中完全可以将每一行作为一个一维数组来使用。
数组作为函数参数
我们将数组作为函数参数,写一个冒泡排序的函数,将给定的一个数组进行升序排序并输出:
结果:
优化一下,如果已经有序了就提前跳出循环:
需要再强调一下我们传参传入的数组,其实传入的是数组首元素的地址,本质上是一个指针,千万不要以为我们传入的是整个数组。
数组名一般时候都是代表的数组首元素的地址,本质是指针。但是!有两种例外的情况:
- sizeof(数组名)--此时的数组名代表整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节
- &数组名,数组名代表的是整个数组,&数组名,取出的是整个数组的地址。而数组的地址等于首元素的地址,二者的值是一样的但是意义完全不相同。
数组的实例应用
三子棋
这个三子棋的实现是我目前做的代码量最大的一个任务(流汗)。跟着老师的节奏,下来自己重新敲了一遍,感觉想不明白的还得反复看才勉强实现了需求,还是任重而道远。下面是代码:
头文件game.h
源文件game.c
源文件test.c
最终实现的效果:有三种结局
第一种是玩家获胜:
第二种是电脑获胜:
第三种是平局:
扫雷游戏
明天在搞吧好累(流汗)