forum.jpg

这一部分将继续讲解C语言中的数组。将从(1)数组的概念以及为什么需要数组?(2)怎么定义一维数组?(3)怎么初始化并使用一维数组?(4)sizeof计算数组中元素的个数(5)字符数组几部分讲解。
(1)数组的概念以及为什么需要数组?
数组就是由多个完全相同类型的数所组成一个组。因此当我们想要定义一组同一类型的元素时就可以使用数组。数组有一维数组和多维数组,目前先讲解一维数组。
(2)怎么定义一维数组?
数组元素类型数组名[数组元素个数]; 比如int a[2];定义一个有2个int类型的数组
其中[ ]是数组的标志,[ ]中的数字叫做数组下标,我们通常是通过下表引用来访问数组中的每个元素(也可以通过指针来访问,本质一样后续讲解如何通过指针来访问数组中的元素)。
数组名的值是个常量,也就是数组中第一个元素的地址。它的类型就取决于数组中元素的类型。如果数组中的类型是int,那么这个数组名就是指向int类型的常量指针。注意这个值是指针常量,不是指针变量,因此我们不可以对这个数组名进行赋值操作。不过在计算数组中元素的个数和&取地址运算符(&既可以作为位操作运算符中的位与元素也可以当做去地址运算符,具体情况具体对待)操作时,并不把数组名当做一个指针常量来表示。
(3)怎么初始化并使用一维数组?
数组作为一个整体进行定义。是通过在一对花括号{}中输入相应的值,每个值用逗号隔开,比如1)int a[2];a[0]=1; a[1]=2; 2)int a[2] = {0,0}; 3) int a[2] = {0};
第一种:先定义后初始化,其实这里的初始化就是赋值(包括对部分元素或者全部元素进行赋值)
第二种:在定义的时候直接进行初始化(包括对部分元素或者全部元素进行初始化)
如果是不完整的初始化,编译器只知道初始值不够,它会根据总的元素个数和已经初始化的元素个数,计算出最后几个未初始化的值,对这些值进行默认初始化。如果在初始化时没有给出数组元素的个数,则编译器会根据所初始化的元素的个数自动计算数组元素的个数。最好在定义数组时就进行初始化,因为定义并初始化后数组中元素的值确定了,即使后续忘记进行相应的赋值操作,数组中元素的值也不会是随机的。但是使用的时候不能作为整体使用,使用时必须拆开使用数组中的各个元素。譬如数组int a[2],有2个元素,分别用a[0]``a[1],下标为0代表数组中第一个元素,下标是1代表数组第二个元素。如果数组长度为n,下标中最后一个是n-1。访问数组时要特别注意下标,下标是从0开始的,如果下标超出了n-1,会产生越界访问,会出现相应的错误。因此我们在对数组操作时一定不要越界访问。
(4)sizeof计算数组中元素的个数
在实际的开发或者面试中常常见到需要求数组中的个数,比如这里求一维数组中的个数,可以通过sizeof关键字来实现。在嵌入式Linux开发《C语言专题(二:有趣的基本数据类型)》文章中用sizeof测试过基本数据类型所占的内存空间长度。
测试代码如下图所示:
forum.jpg
一维数组定义、初始化及计算数组元素的个数
(5)字符数组
字符数组就是数组中的元素都是字符。
初始化方式有2种:char a[] = {'h', 'e', 'l', 'l', 'o', 0}; char a[] = "hello";常用的是第二种。
字符串常量定义并初始化 char a* = "hello"; 这个字符串常量与前面的字符数组不一样,前者是字符串常量,而后者则是初始化字符数组中的元素。并且前者所指向的是存储"hello"这个字符串的内存地址(也就是首字符'h'的地址)。
总结:数组中的所有元素必须是同一种数据类型,不可能在一个数组中存储两种数据类型的数。这即是数组的优点也是数组的缺点。如果我们想要在一组数中有多种数据类型存在,那么可以考虑用结构体来实现(后续讲解)。因此在使用数组时要考虑它的应用场景。