首先,我们要知道数组是什么,数组其实是一组相同类型元素的集合,用于存储若干相同元素
下面将分别介绍一维数组,和二维数组的相关知识。
一维数组
一维数组的创建:type_t arr_name [const_n];
- 其中 type_t 是数组存储元素类型,如int、char等
- 而 arr_name 是数组名,可由我们自己命名
- const_n是 一个常量表达式,用于指定数组的大小
一维数组的初始化:数组的初始化分为:完全初始化、不完全初始化、不初始化,元素由{}包裹起来,各个元素之间由英文下的逗号隔开
完全初始化:顾名思义,数组初始化时为,所有的元素赋值
例如:
不完全初始化:与其相对应,在数组初始化时,仅为部分元素赋值
例如:
值得注意的是,对于整形数组,未初始化的元素默认存放的是0;对于字符型数组,未初始化的元素,则默认存放的是空,即’0‘
不初始化:同理,即为在数组初始化时,不为任何一个元素赋值
例如:
要注意的是,不初始化的数组,一定要指定数组的大小,且此时数组内存储的元素为随机值;完全初始化数组和部分初始化数组,在初始化的时候可以不指定数组大小,此时数组大小由数组存储的元素个数决定。
一维数组的使用:
一维数组的使用是通过下标操作符:[ ] 来访问的,以达到使用数组内元素的目的。我们需要知的是, 数组的下表操作符的下标是从0开始的,然后依次加1。
例如:
一维数组在内存中的存储:
一维数组在内存中的存储是连续的,从首元素到最后一个元素,地址由低到高,各个地址间相差所的大小为存储元素的类型所占的字节数。
例如:对于整形数组,相邻元素的地址间相差4
对于字符型数组,相邻元素的地址间相差1
二维数组
二维数组的创建:type_t arr_name [rol][col];
与一维数组相比较,二维数组的创建需要指明行和列,其中,第一个方括号中的row为二维数组的行数,第二个方括号中的col为二维数组的列数。此外,二维数组共有row*col个元素。
二维数组的初始化:
与一维数组相同,二维数组的初始化也分为: 完全初始化、不完全初始化、不初始化,元素由{}包裹起来,各个元素之间由英文下的逗号隔开。但和一维数组不同的是,二维数组的初始化方式要多出一种,下面就让我们来一起看下吧。
完全初始化:
可以看到,第一种初始化方式,与一维数组相同,元素由外边的一个{}包裹起来,各个元素之间由英文下的逗号隔开。而第二种初始化方式中,不仅外边有着{},而且{}的里面还有着其他{}。
关于第一种初始化方式,我们知道该数组是3行3列的二维数组,数组中的元素是按照一定先后顺序往数组里面放元素,从左往右看,每当放满一行元素后数组换到下一行继续放元素。
而关于第二种初始化方式,里边的{}中的元素,分别为一行的元素,即中间每一个{}都代表单独占有一行,实际上这种初始化的方法要比第一种要好很多,能更清楚的知道数组的每行元素有哪些,所以一般我们会使用这种初始化的方法。
最后关于第三种,我们会发现,其初始化省略了数组的行的大小,而这种初始化的方法是正确的,在二维数组当中,初始化数组可以省略行,但是要注意的是,一定不能省略列的大小,因为,行的省略可以由列的大小来确定其大小,但列的省略却不可以由行的大小来确定其大小。
不完全初始化:
作为不完全初始化,由上面知道,每当放满一行元素后数组换到下一行继续放元素。
第一种初始化方法第一行元素为:1,2,2,第二行元素为:3,3,4,而作为整形数组,剩余未初始化元素默认为0,即第三行元素为:0,0,0
同样的,作为整形数组,第二种初始化方法剩余未初始化元素也默认为0,第一行元素为:1 ,2, 0,第二行元素为:2,3,4,第三行元素为:3,4, 0。看懂了上面的的小伙伴们这个是不是就很简单了呢
不初始化:
而对于不初始化的数组,我们要特别注意,一定要给定数组的行数和列数大小,这里的行和列的大小都不能省略,否则编译器将会报错,不能运行。
二维数组的使用:
我们了解了一维数组的使用,二维数组的使用就应该不难理解了,它是通过下标操作符:[ ] 来访问的,我们知道相比于一维数组,二维数组要区分行和列,也就是说,我们要分别通过前后两个下表操作符 [ ] 来访问数组的行数和列数,并且行和列的下标也都是从0开始,依次加1,所以就不难理解
arr[i+1][j+1]表示二维数组的第 i 行第 j 列的元素
例如:
二维数组在内存中的存储:
与一维数组相同,二维数组在内存中的存储也是连续的,从左往右,由上至下,依次从第一行首元素到最后最后一行最后一个元素,地址由低到高,各个地址间相差所的大小为存储元素的类型所占的字节数。
例如:
数组的越界
最后再来谈一谈数组越界的问题,那什么是数组的越界呢?经过上面的讲解,我们知道数组的访问是通过下表访问操作符 [ ] 来访问的,而数组的下标是有一定的范围限制的,例如一个存储n个元素的数组,其第一个元素下表是0,最后一个元素下标是n-1,其下表范围应是:0到n-1之间,而一旦超出这个范围,超出数组合法访问的空间,就被称为数组的越界。
值得一提的是,C语言本身不做数组下标越界的检查,所以如果代码中有数组越界的错误,编译器也一般不会报错,但是编译器不报错不意味着程序是正确的,所以我们在写关于数组的代码时,一定要做好数组是否有越界的检查。
非常感谢能够看完的小伙伴们,如果感觉有帮助的话,能不能点个赞支持一下呢,谢谢啦!