一.数组的概念
C语言中可以存储一个或多个相同类型元素的集合。
二.数组的分类
数组分为一维数组和多维数组,我们称二维数组及以上的数组为多维数组。
三.数组的类型
数组也是有类型的,数组算是一种自定义类型,去掉数组名就是数组的类型
比如:char a[100]的类型就是char字符型;int b[100]的类似就是int整型。
四.一维数组的理解
1.一维数组的命名(创建)
type arr_nam[常量值](注意,常量值有时候也不需要,具体请看下文)
2.一维数组的初始化
a.完全初始化
b.不完全初始化
此时,编译器会自动为没有初始化的地方用零补齐。
c.特殊初始化
虽然该数组一开始并未输入常量值,但编译器会自动将此时元素个数默认为常量值大小。
3.一维数组的下标
这个时候,我们初始化了数组中的元素,那该如何将它们提取出来呢?试试上,数组中的每个元素都有代表它的下标,下标就像我们在学校的学号一样,知道学号,就可以知道对应的那个人。当然了,数组下标没有学号那么复杂。
事实上,对于上图这样的一维数组,它在内存中是连续存放的(下文会解释),下标是从0开始,依次往后加1。
naru那如何利用下标提取数组中的元素呢?我们知道,在C语言里,有一种操作符是[]下标引用操作符,通过它,我们可以利用下标来提取数组中的元素。如果我们想要1,只需要arr_test_four[1]即可;如果我们想要10,只需要arr_test_four[9]即可。
4.一维数组的输入与输出
根据前文,我们只能得到数组中的一个元素,或者得到整个数组的效率太低。那有什么好方法嘛,当然就是利用循环来访问整个数组啦。
a.整个数组的输入(这样可以使得程序更加灵活,也更满足客户需求)
b.整个数组的输出
4.一维数组在内存中的存储
为了以后指针的学习,我们现在稍微了解一下一维数组在内存中的存储。
由图,因为该数组是整型类型,每个数据是四个字节,故我们可以得出结论,一维数组在内存中是连续存放的。
5.利用sizeof计算数组中元素的个数
在编写程序的过程中,假如我们要更改数组中元素的个数,那我们同步要修改的地方可能有点多,那如何避免这个问题呢?我们可以利用sizeof操作符。首先我们要知道,sizeof操作符计算的是该数据在内存中所占空间的大小。
a.sizeof应用格式
size_t sz=sizeof(num);size_t在C语言中是一种无符号整型,sz为所测数据在内存中所占空间大小,num为我所要测的数据。
b.sizeof在数组中应用
如何用sizeof测数组元素个数呢,这里我们以下图为例。
因为数组中每个元素的类型相同,故我们只需要用整个数组的大小除以数组中一个元素大小就可以求出数组元素个数。
c.sizeof的注意事项
这里我们需要注意的是,sizeof测数据的大小并不会真的跑到内存中测该数据的大小,而是根据数据的类型得出其在内存中的大小。如下图所示。
五.二维数组的理解
1.二维数组的概念
首先我们知道,int arr[4]是以整型变量为元素的一维数组(集合)。char arr[7]是以字符变量为元素的一维数组(集合)。那二维数组是以什么为变量的二维数组呢?实际上,二维数组是以每个一维数组为元素的二维数组。(为什么?目前作者也不知道,大家先知道即可)
2.二维数组的命名(创建)
type arr_name[常量值1][常量值2];常量值1代表行,常量值2代表列。
3.二维数组的初始化
a.完全初始化
b.不完全初始化
第一种没有完全初始化,用0补齐;第二种使用大括号,单独为行初始化,其余用0补齐。
c.特殊初始化
二维数组初始化的时候,可以省略行,但是不能省略列,这个也很好理解,稍微画图就能理解(试想一下,如果未规定列的话,要补充多少0呢)。
4.二维数组的下标
与一维数组类似,相应的,二维数组也有下标,用来调出相应的元素。
无论行和列,都是从零开始,逐次加一。根据这个就可以调出我们需要的元素。
5.二维数组的访问(整体调用)
a.二维数组的输入
与一维数组类似,只不过需要利用嵌套循环。
b.二维数组的输出
与一维数组类似,只不过需要利用嵌套循环。
6.二维数组在内存中的存储
根据上文,肯定会有人二维数组是按照之前二维数组下标图的模式在内存中存储的。事实上并非如此。
由图我们可以看出,事实上,二维数组在内存中也是连续存放的,如下图所示。
六.变长数组
大家是否会觉得常量值的使用不太方便,要么设置过大浪费空间,要么设置的过小导致数组越界。事实上,C99之后,出现了变长数组,就是常量值可以由用户输入决定大小。我们知道,在c语言编译器中,编译器会为数据提前安排内存存储,但是变长数组却不是如此,只有在程序运行时才能知道其所占的内存大小,这正是变长数组的特性导致的,当然,因为如此,变长数组也是不可以初始化的。我们应该注意,变长数组并不意味着它的大小可以变化,而是可以由用户来决定数组大小,一旦决定便不可改变了。遗憾的是,我们常用的vs2022不支持变长数组,而以gcc为基础的小熊猫c++和devc++支持变长数组。
PS:作者目前为大一新生,可能有地方表达有误,或者对概念理解不对,如有错漏,欢迎指正,我会认真修改。