
数组是一组相同类型元素的集合
数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
一组数组创建的基本语法如下:
1 type arr_name[常量值];
数组的元素 数组 数组的元素个数
类型 名字存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。
比如:如果想存储一个班级人的数学成绩,就可以这样创建一个数组:
int math[20];//整型数组也可以根据其他需要,创建其他类型和大小的数组:
char ch[10];//字符数组
double data[21];//浮点型类型数组有时候,在数组创建的时候,我们需要给定一些初始值,这种就称为初始化。 数组的初始化一般将数据放到大括号里面,为了便捷,我们这里将初始化内容和监视窗格的内容直接放到一起看:


字符数组既可以用字符串初始化,也可以用单个字符来初始化(注意只有字符数组可以这样做)虽然ch1和ch2初始化的形式不太一样,但是实际效果是一样的:

而且数组只要初始化了就可以省略掉数字的大小,数组的大小会根据初始化的内容来推断,如arr5:

注意这是一种错误的初始化方法:
int arr3[5] = { 1,2,3,4,5,6};//错误的示范,初始化的项太多,系统会报错数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型:
1 int arr1[10];
2 int arr2[12];
3
4 char ch[5];arr1数组的类型是int [10] arr2数组的类型是int [12] ch数组的类型是char [5] 注意,单独的int,char说的是数组里一个元素的类型,数组元素是有类型的,但数组的本身也是有类型的。 这里用一串代码解释一下为什么要提这个概念,之前为了打印数据所占的长度,既可以用它的变量名,也可以用它的类型:

我们也可以用sizeof算数组所占内存空间的长度:

出现这样的计算结果的原理是,一个数组有10个元素,每个元素都是int类型,四个字节,10个元素就是40个字节,可以看出这里用数组的类型打印和数组名打印的结果是相同的,所以[ ]里的值也是类型的一部分,这也是解释这个概念的原因。
数组存放数据的目的就是对数据进行操作,那我们如何使用一维数组呢?
C语言规定数组是有下标的,下标的作用,类似于在一个公寓里找房间,通过房间号找房间,在数组里用下标找元素,比如说6的下标就是5,也可以叫索引,本质上没有区别,只是叫法不同。下标从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:
1 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
在C语言中数组的访问提供了一个操作符[ ],这个操作符叫:下标引用操作符。 有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为5的元素,我们就可以使用arr[5],这里展示一下输出效果:

这里也可以把[ ]里的值进行更改:

如果我们想要访问整个数组的内容,要怎么操作呢? 根据前面的内容,只要我们产生所有元素的下标就可以了,我们可以使用for循环产生0~9的下标,然后使用下标访问就可以了。 如下:

当然倒着整也可以,只要思想不滑坡,办法总比空难多

这里我们也可以打开监视窗格,里面有具体的下标和元素的一一对应,这里我就不展示了。
明白了数组的访问,我们也可以根据自己的需求,给数组输入自己想要的数据,如下:

有的兄弟就要说了,之前不是在关机程序里说过吗,数组名本来不就是地址吗?为什么这里还要取地址

注意这里是一个数组元素,不是地址,这些数据都是挨个读入放入数组之中,也同样的原理,挨个输出出去,依旧可以打开监视窗格验证,数组中每一个元素都有它的地址,所以才能取地址。
有了前面的理解,我们在使用数组的时候就没有什么障碍了,但是如果要深入了解数组,我们还要了解一下数组在内存中的存储,接下来展示如何依次打印数组元素的地址:
printf("&arr[%d] = %p\n", i, &arr[i]);这串代码的意思就是把下标i的元素的地址打印出来:

这里是不是地址前面好多0,显得很长不好看呢?其实只要微微调整一下就可以了,这里再扩展一下。 这里我们用的是64位平台即x64,64位平台地址都比较长一些,系统默认的都是配置成64位环境,编译出来的是64位程序,只能在64位环境中运行。这里我们改用32位平台,配置成32位环境,编译出来的是32位程序,32位程序在32位环境、64位环境中都能运行,即x86就可以很好的解决这个问题了。


从输出的结果我们分析,数组随着下标的增长,地址是从小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。 这里有兄弟要问了,怎么看出来差四个字节的,不是还有C吗,这个是怎么看的。 按照常规的理解:
但是如过16进制的每一位数字是这样的话,那我问你,如果给你一个数字,比如说112 你说这是一个什么数字,这是一个112吗?还是第一位是1,第二位是12呢?还是1 1 2呢?所以当我们写出112的时候,是区别不出来是第一种表示还是第二种表示的,所以这时候16进制的数字就是这样一一对应的,无论大小写都无所谓。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
a b c d e f
A B C D E F
补充:这里0C变成10是12加4,16进制是逢16进1,所以变成10了。

所以我们得出结论:数组在内存中是连续存放的。这里还牵扯着后期指针的问题,后面会出文章来写。
这个标题是什么意思呢? 这里我们举一个例子,比如说我们要打印这样一个数组的内容

这个数组不一定有8个元素,也有可能有18个元素,但是上面如果变的话,下面i<8就要改为i<18,这个就不方便了是不是,那么有没有什么方法无论上面数组元素个数怎么改变,下面的代码不变呢?这里就让i<8与数组元素个数关联起来就可以了。这里就涉及了一个问题,如何计算一个数组的元素个数?
方法是有的,可以使用sizeof,也是老朋友了。 sizeof是C语言中的一个关键字,可以计算类型或者变量的大小的,其实sizeof也可以计算数组的大小。比如:

这里整型一个元素是4个字节,有10个元素,所以是40个字节,计算的是数组所占内存空间的总大小。 我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占字节的个数,数组的元素个数就能计算出来。这里我们选择第一个元素算大小就可以,因为一个数组的类型如果是整型,它的所有元素的大小都是相同的,再加以代码解释:
sizeof(arr) //计算的是数组的总长度sizeof(arr[0]);//计算一个元素的长度(第一个元素)printf("%zd\n", sizeof(arr) / sizeof(arr[0]));//计算元素个数总长度除以一个元素的长度嘛。

这样就可以计算出数组的元素个数了。我们再用sz替换掉for循环中判断的部分,无论定义的int arr[ ]括号内是什么值,都不用再更改for循环中的判断条件了,是不是很方便呢?这里我们方括号内的内容改为5。

今天的数组内容就写到这里了,也是又花了一个晚上的时间,希望各位能喜欢小编的内容,多多三连支持一下,小编目前的计划是在大一下学期结束之前搓出一个扫雷游戏,尽量争取吧哈哈,期末了课程还是挺紧张的。