![零基础入门学习C语言:带你学C带你飞](https://wfqqreader-1252317822.image.myqcloud.com/cover/676/26125676/b_26125676.jpg)
3.1 一维数组
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P91_66842.jpg?sign=1738820960-3KomcIB3c48YWC5e8Z4TLvHjSO9dE7TB-0-208bfaeeec6da944d3ba5f2994123f13)
视频讲解
3.1.1 定义一维数组
数组就是存储一批同类型数据的地方,定义一维数组的语法格式为:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P91_103757.jpg?sign=1738820960-5rIPUWuBluDyS6Yx85lOL2OkIueaGub7-0-6f5ef75ffcd0935d23d71a251b72f9d0)
在定义数组时,需要在数组名后边紧跟一对方括号,其中的数量用来指定数组中元素的个数,因为只有告诉编译器元素的个数,编译器才能申请对应大小的内存给它存放。
上面三种数组类型,都占用多少字节的内存呢?
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P91_103759.jpg?sign=1738820960-I2EGQjs0s6Ba7nJIMc8Ou8n8bzSDYA70-0-85bdaecbc3b1ac993ce62cfdaff3e530)
在本书的编译环境中,它们都是占用24字节的内存空间。在编译器编译程序的时候,这个空间就已经创建了。
3.1.2 访问一维数组
访问一维数组中的元素,同样是使用方括号:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P91_103760.jpg?sign=1738820960-MWelau4cNAJJtYkswFvSk4uRa1qbOdoX-0-0370b835a2211cccf036b90b7e856139)
注意:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P91_103762.jpg?sign=1738820960-zAjWTVBsJuilSAVSCmcvPmYoiy51pWPC-0-66414ec8586ef74796164ecb98f55a85)
3.1.3 循环与数组的关系
在此之前有些读者可能会感到疑惑:为什么循环变量通常初始化为0,而不是1呢?比如实现一个执行10次的循环,通常是这么写的:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P92_103763.jpg?sign=1738820960-wWfnHWGckguZ6RUL4fhn5p4QlRwALeRI-0-53b3f5dd795a53b63a478a0225514e7a)
而不是这样写(当然下面这样写也没错,这里只是讨论习惯问题):
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P92_103764.jpg?sign=1738820960-ZP11BVk0X9zHoxMnLB0SXJ0yEltaHCr0-0-f539fe45db17a93395bdf60b67262246)
这是因为我们常常需要使用循环来访问数组:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P92_103765.jpg?sign=1738820960-vvVuQT7MygOW6WwV7FteYuZMVm6709VK-0-e8c40829c456bddaf1bcb7ef1e96002e)
举个例子,下面代码尝试使用数组存放班级里10位同学的数学成绩,并计算出平均值:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P92_103766.jpg?sign=1738820960-YnoBPQWYeDPw2LggfRhNzUlZhcFM2pbi-0-c41c5eb68c4d63dc907aa60a046d66c0)
程序实现如下:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P92_103767.jpg?sign=1738820960-cokbXFDgmZfwaBTHV1XNEHK9eFvoIvu7-0-940757ed7402853921cfecf7574a4913)
3.1.4 数组的初始化
在定义数组的同时对其各个元素进行赋值,称为数组的初始化。数组的初始化方式有很多,下边逐一介绍。
(1)将数组中所有元素初始化为0,可以这样写:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103769.jpg?sign=1738820960-qupcmRFOCVObxzadxCTsL1tK2uahBMGI-0-349928959e611e08ac59095e8d590f2d)
(2)如果是赋予不同的值,那么用逗号分隔开即可:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103770.jpg?sign=1738820960-8iovFvKC2CeELXMdeCZhSu9qr5qzZTZ0-0-9ec20a3d08544630d57c993a94ed62b1)
(3)还可以只给一部分元素赋值,未被赋值的元素自动初始化为0:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103771.jpg?sign=1738820960-xqSQd3dStzdn2tB0GUQFrCt2eLUoGWTj-0-e0bb54923c84b796e7c23f066f63e7e6)
(4)有时候还可以偷懒,可以只给出各个元素的值,而不指定数组的长度(因为编译器会根据值的个数自动判断数组的长度):
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103772.jpg?sign=1738820960-Fu66RlUlb10nRYcv4wObKtH6lF4btECI-0-45c2406028048c6975de42963a19592c)
(5)C99增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103773.jpg?sign=1738820960-hfrRcmgsTS4D5sYH1UfMfdZao4gUo1vV-0-831ff2107e056bb75c8ed2fe29551b10)
3.1.5 可变长数组
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_67183.jpg?sign=1738820960-XSWg8JYtuUBJtOsgiCnwmkbzpdoxWl2V-0-afaa36bcc0481e9dd0b2a9958bb0af9b)
视频讲解
在C99标准出现之前,要求定义数组的时候,数组的维度必须为常量表达式或者const的常量,所以那时候如果把代码写成下面这样,就会报错:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P93_103774.jpg?sign=1738820960-0AkwCtDmWbOlA1aawkJJ2G9noCdXB4GV-0-5decdcd0f510f89acaf624cf66253dae)
但是从C99标准开始,C语言正式支持可变长数组(Variable Length Array, VLA),这里的“变长”指的是数组的长度可以在程序运行时才决定,不过一旦完成定义,数组长度在其生命周期内就不能再改变了。请看下面例子:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P94_103776.jpg?sign=1738820960-wUzJ5iALuyAOXdfru2Szi9Hxcl4YJtZV-0-3b4c464636d87eae5451e6bf330d77cf)
程序实现如下:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P94_103777.jpg?sign=1738820960-TiEZRj4Aa3VE5xMKGfziLw2JdLLJZqdc-0-a75af4b7f3f8a0c09a5e9a5e4456b7a6)
3.1.6 字符数组
还记得之前介绍过,C语言是没有字符串类型的,那么C语言是如何存放和表示字符串的呢?有两种方式:字符串常量;字符类型的数组。字符串常量就是用双引号括起来的字符串,它一旦定下来就没有办法改变。更灵活的方式是使用字符类型的数组来存放和处理字符串,这样,数组中的每一个元素表示一个字符(注意:最后还需要添加一个字符串的结束符'\0')。
接下来快速回顾一下,定义字符数组的方式有哪些。最简单的是先定义指定长度的字符数组,然后给每个元素单独赋值:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P94_103778.jpg?sign=1738820960-gAwUKKMeTwpt6iD4GeKuTf0tvEPymDDO-0-e200230c04304c1e756b84432ed9120c)
还可以直接在定义的时候对字符数组进行初始化,这样会方便很多:
![](https://epubservercos.yuewen.com/701183/14565324404897806/epubprivate/OEBPS/Images/Figure-P95_103780.jpg?sign=1738820960-GDEWkM10AT09dCIgwPay2tT55s3fn9Bo-0-046eb52c3a36134dc1ea09c1f2be9481)