数组
前言
大家好,很高兴又和大家见面啦!前面咱们已经把函数的相关知识点学习完了,今天咱们将开始进入数组内容的学习。在本篇章中,我会给大家带来一维数组与二维数组的详细内容,接下来我们就开始今天的正题吧!
一维数组的创建和初始化
1.数组的创建
1.1数组定义
数组是一组相同类型元素的集合。
我们怎么来理解这个相同类型呢?这里我们可以借用数学的角度来理解;
在数学中,集合就是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成集合的这些对象则称为该集合的元素。
这里我们可以简单的举几个例子来说明集合:
- 自然数的集合
就是由
这些非负整数组成的一个集体;
- 正整数的集合
就是由
这些正整数组成的一个集体;
- 整数的集合
就是由
这些整数组成的一个集体;
- ……
这些集合里的元素都是满足了某一特定的条件,在计算机中,这一特定的条件就是相同的类型。 这里的类型指的就是元素的数据类型。所以我们需要有一个概念就是——
只有相同类型的元素才能组成一个集合。
在计算机语言中,我们把这种集合称为数组。 比如int类型的元素只能与int类型的元素组成集合称为整型数组; char类型的元素只能与char类型的元素组成集合称为字符数组……
现在我们知道了什么是数组了,那我们如何用计算机语言来创建一个数组呢?下面我们就来介绍一下数组的创建方式;
1.2数组的创建方式
对于一个数组的创建,我们需要有3个要素——数组元素类型、数组名以及数组的空间大小或者说是数组的元素个数。数组创建的格式如下所示:
代码语言:javascript复制//数组的创建
type_t arr_name[const_n];
//type_t——数组的元素类型;
//arr_name——数组的名字;
//const_n——是一个常量表达式,用来指定数组的大小;
按照这个格式,我们就可以尝试着创建出字符数组、整型数组、浮点型数组……
代码语言:javascript复制//字符数组
char ch[10];
//整型数组
short / int / long / long long arr[20];
//浮点型数组
float / double arr[30];
在这个格式中我们需要注意几个点:
- 数组的元素类型包括但不限于上述提到的这些原子类型,数组元素的数据类型还可以是像结构体这样的自定义类型;
- 数组名与变量名是一样的,没有强制性的要求一定是要使用什么名字,可以根据个人喜好来命名;
- const_n表示的是常量表达式,如果我们使用的是变量的话,那数组是无法成功创建的;
- 当数组的大小确定后,我们是不能对数组的大小进行更改的。
在C99之后引入了变长数组的概念,允许我们可以使用变量指定数组大小。也就是说在支持C99标准的编译器比如gcc编译器是可以在创建数组时使用变量来表示数组大小的;
博主使用的编译器是VS2019,这个编译器下是不支持变长数组的,但是我们在创建数组时除了上述的这种按格式创建数组外,还可以像下面这种格式来创建数组:
代码语言:javascript复制type_t arr_name[] = { array_element };
//type_t——数组的元素类型;
//arr_name——数组的名字;
//array_element——数组元素;
通过这种格式创建的数组,其数组的大小与数组的元素个数是相等的,数组的大小确定后同样也是不可以更改的。
如下所示:
从这个监视窗口中我们可以看到,此时数组内的6个元素都已经完成的赋值,但是在进行第7个元素的赋值后系统报错了报错内容是数组arr的栈区损坏了。也就是说,通过这种格式创建的数组并不是代表它的大小可以被改变,数组的大小与数组定义时的元素各数是相同的。
这种省略数组大小的格式我们可以理解为是是以元素的个数表示数组大小。这种形式其实是直接在创建数组时就给数组进行初始化。下面我们就来探讨一下什么是数组的初始化;
2.数组的初识化
2.1数组初始化定义
在创建数组的同时给数组的内容一些合理初始值。
2.2数组初始化的形式
我们在对数组进行初始化时有两种形式——完全初始化和不完全初始化。
代码语言:javascript复制//数组的初始化
//整型数组
int main()
{
int arr1[5] = { 1,2,3,4,5 };//完全初始化
int arr2[] = { 6,7,8,9,10 };//完全初始化
int arr3[5] = { 11,12,13 };//不完全初始化
return 0;
}
在这个代码中我们可以看到,通过第一种格式创建的数组是可以进行完全初始化和不完全初始化的,但是对于第二种省略数组大小的创建格式来说,它就只有完全初始化这一种方式。
前面我们是以整型数组来举例的,下面我们再来看一个代码:
代码语言:javascript复制//字符数组
int main()
{
char ch1[] = "abcd";
char ch2[] = { 'a','b','c','d' };
return 0;
}
大家思考一下,这两个字符数组一样吗?为了搞清楚这个问题,接下来我们来介绍一下数组内的元素;
2.3数组的元素
对于整型数组来说,我们可以很容易理解,数组内的元素就是对应类型的数字,但是对于字符数组来说,它的元素是有两种书写形式的:
- 一种是和整型数组一样的,使用单引号将字符一个一个的放入数组的大括号"{}"中;
- 还有一种形式就是通过双引号将多个字符直接赋值给数组。
这种通过双引号引起的一个或多个字符被称为字符串。
那这字符串和单个字符又有什么区别呢?下面我们来探讨一下它们之间的区别。这里我们需要引入一个库函数——计算字符串长度的库函数——strlen。
它的作用就是通过计算字符的个数来计算字符串的长度,我们在使用时需要引用头文件string.h。 下面我们就来看一下这两个数组的区别;
从这个结果中我们可以看到,不仅是计算的字符串长度不同,而且打印出来的字符串也是不一样。 为什么会有这种区别呢?下面我们来进行调试通过监视窗口观察一下:
调试的步骤:
我们在打开监视窗口后在输入栏输入我们想要观察的对象就可以了,接下来我们就可以通过监视窗口观察两个数组的元素了:
在监视窗口中,我们可以得到以下几个信息:
- ch1/ch2这两个数组里面存放的内容是不相同的
- 数组ch1中存放了五个元素——字符a、b、c、d和字符 ;
- 数组ch2中存放了四个元素——字符a、b、c、d;
- 在系统错误列表窗口中有一个警告信息——字符串ch2没有添加字符串零终止符;
- 报错的代码是在strlen这一行;
由以上信息我们可以做个猜想,是不是只要我们在ch2中加入这个 ,那这两个数组存放的内容就一致了呢?下面我们就来实践一下:
可以看到此时我们打印的内容就完全一样了,现在我们就可以得到结论:
- 由双引号引起的字符串是由看的到的字符与看不到的 组成的