一.一维数组的创建和初始化
1.1 数组的创建
数组是一组相同类型元素的集合,在C99标准之前数组创建不支持使用变量,只能用常量。C99中增加了变长数组的概念,允许数组大小是变量,但很多编译器对C99标准支持不够好,所以创建数组的时候一般还是按照数组创建只能使用常量。
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
数组的创建形式如上所示,type_t为创建的数组类型,也为数组的元素类型,arr_name为数组名,[]中的常量代表创建数组的大小。在创建数组的时候和创建变量一样,一般还要对其进行初始化,把数组元素初始化为0是一种对数组常用的初始化。
例如下面便是数组创建的实例,char是数组中元素的类型,也是数组类型——字符数组,arr是数组名,[10]代表数组大小为10个元素,其它的以此类推,都是一样的道理。
char arr[10];
float arr1[1];
double arr2[2];
int arr3[3];
1.2 数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
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};便是不完全初始化,因为创建数组的时候创建了数组大小是十个元素,但只初始化了三个元素,所以剩下七个元素会被默认初始化为0。
像第二个数组没有给定大小,但进行初始化了,那么数组在创建的时候就会根据初始化元素的多少默认在栈中开辟相匹配的空间,也就是说会默认初始化为刚好装进所有初始化的元素。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UO97wMF9-1637686758651)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20211123142219996.png)]
在字符数组初始化的过程中,带单引号的会被视为字符,转化为其对应的ASCII值后被存储起来,而不带单引号的数字会被认为输入的是ASCII值,直接存储起来,如上图所示。
char arr1[] = "abc";
char arr2[3] = {
'a','b','c'};
strlen是一个库函数,计算的是字符串的长度,并且只能针对字符串,关注的是字符串中是否有’\0’,计算的是’\0’之前字符的个数。使用strlen的时候注意,不能使用strlen去计算字符数组中第一个元素为0的数组,因为不加单引号的0在字符数组中认为是ASCII值得0,读入内存中存储得也是ASCII值得0,ASCII值得0也就是’\0’,所以在用strlen对其求长度时,遇到第一个字符便是’\0’,求得得长度也就是0了。
sizeof是一个操作符(运算符),sizeof是用来计算变量所占内存空间大小的,任何类型都是可以使用的,只关注空间大小,不关注内存中是否存在’\0’。
对于上面的代码要注意区分,带有双引号的是字符串,字符串末尾默认有’\0’,而单引号就是三个字符,没有’\0’。所以在使用strlen函数求arr1的长度是会求出为3,因为’\0’作为strlen求字符串长度结束的标志,而’\0’本身不算作长度,而求arr2的长度时候就会为随机值,因为单个字符后没有’\0’,strlen会在内存中一直向后查找,遇到第一个’\0’时将其前面所有的长度,算作arr2的长度。
而使用sizeof求数组大小的时候,arr1的结果是4,因为’\0’会被算作数组大小之中,而arr2的大小则为正常的3,因为一共有三个字符,每个字符的大小为一字节。
1.2.1指定初始化器(C99)
C99增加了一个新特性:指定初始化器。利用该特性可以初始化指定得数组元素。例如只初始化数组最后一个元素,对于传统得C语法来说,必须先初始化最后一个元素之前得元素,例如:
int arr[6] = {
0,0,0,0,0,212};//传统的语法
int arr[6] ={
[5] = 212};//指定初始化器
对于一般的初始化,在初始化一个元素后,未初始化的元素都会被设置为0。
#include <stdio.h>
#define MONTHS 12