数组这个东西好用,但它的规矩挺多的。一不留神就会出错。当时我第一次学习到的时候,只是学到个皮毛没想的那么深,导致后面的学习疑惑很多。下面我就来好好介绍一下它的‘规矩’。
首先,先讲讲数组是如何创建的。就像变量名一样,你创建一个数组,必须声明它的类型是什么。例:
int arr[n]
这里面int就是arr数组中存储数据的类型。说明这个arr数组中只能有int型数据,不能有其他的数据。
n表示了你这个数组中存储了多少了int类型的数据。
这里就有需要注意的点了,在例子中arr[n]中的n在C99标准之前数组的创建,[]中不能是变量,要给个常量才行。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。
这里我的建议是,一般情况下还是最好不用变量去指定数组大小。
初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
例:
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
可以看到这里的初始化千奇百怪,都是对的,那么它们有什么区别呢,我们又该用哪种。
第一个int arr1[10] = {1,2,3},上面我讲到过[10]代表它有十个数据,而这里只有1,2,3。当这种情况的时候,数组会自动把你没有初始化的值自动赋予0.
第二个这里[]中是空的,那是不是错了呢,不是的,在你数组创建的时候是可以不写它的大小,这个时候它的大小就会默认为你{}中的数据个数,这里为4.
第三个就是刚刚好[]中的大小刚好等于{}的数据个数。
第四个这个是char类型的值,它初始化跟int不一样的是它需要给数据加上‘’才行。如果出现数字没加‘’的话,会按照它的ASCII值来换。这里98对应的是b。
第五个和第六个一起说,可以看到第六个是跟之前的很不一样,它是用“”来包含数据的,这跟第五个有啥区别呢,让我们来看看。
可以看到我们arr5在打印完a,b,c之后又打印了一堆东西,而arr6只打印了它本身。
这个的原因就是arr6中“abcdef”这个后面会自动加上\0(字符串终止符),而arr5不会自动加,所以打印的话,会一直打印到找到\0为止。
使用
创建和初始化完之后,就要使用它的,对于数组的使用我们需要用到一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。可以发现这跟初始化的arr[]是一样的,但是这完全就是两个东西,只是长的一样而已,初始化用到这个只是规定用这个而已。
我们来看代码:
这里就要说一个知识,数组的下标是从0开始的,第一个数据对应的下标是0,依此类推。
这里我用到了int sz = sizeof(arr) / sizeof(arr[0]);这个使用来统计数组中数据的个数,如果对这个不懂,或者疑惑为什么要这么用的,可以看一下我的这篇文章折半查找,其中有详细的讲解。
这里我没有使用,这样有利于下标的理解。
存储
说到存储,就得提到地址。地址就是你数据存储的位置。
让我们看看数组中的数据是成什么样分布在我们的内存中的。
已知地址是按照16进制的,这里我们可以看到每个地址比起上一个地址多了4,这是因为int本身就是4个字节。由此可知,我们数组在内存中是连续存放的,随着下标的增长,地址是由低到高的。
如果还有疑惑可以看到:
这里的p是arr的首元素地址,它每次加1(整型,字节大小为4)后的地址,完美符合数组每个数据的地址,说明它们是等价的。也很好的诠释了我们数组在内存中是连续存放的,随着下标的增长,地址是由低到高的。而且相差的大小,就是你数组类型的大小。
这里需要说到一个知识,数组的数组名就是首元素的地址。相信很多同学都知道这个知识点。那么它是绝对的吗,其实不是,它有两种情况下不是等于首元素的地址。相信有些朋友,在上面吃过亏了。
以防有些同学不知道这个,这里来演示一下。
再看看这个如果arr代表的是首元素的地址,这里应该打印的是4,为什么会打印出整个arr的大小呢。
再看看这个,前面两个正常都是加了4(这里怕有同学看不懂16进制,简单讲一下,16进制中c是12,12减去8为4),到了第三个的时候58到80,是28。(2*16+8)最终是差40。又是整个arr的大小
由此可见:
sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小。(可以看到上面求字符串个数的时候就是用了这个)
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
除此之外,遇到的所有的数组名都输数组首元素的地址。
这些就是我对数组的初步了解,后续我会更新二维数组,以及运用它做个小游戏--三子棋。
如果有哪讲的不好或者不对的地方,感谢指出。