C 语言 10.1 数组

数组由数据类型相同的一系列元素组成

需要使用数组时,

通过声明数组告诉编译器数组中含多少元素和这些元素的类型

编译器需要根据这些信息正确的创建数组,普通变量可以使用的类型,数组元素都可以用
考虑下面的数组声明:
int mian(void)
{
float candy[365]; /内含365个float类型元素的数组/
char code[12]; /内含12个char类型元素的数组/
int state[50]; /内含50个int 类型元素的数组/
}

方括号(【】)表明candy code states 都是数组,方括号中的数字表明数组中的元素个数
要访问数组中的元素,通过使用数组下标数(也称为索引),表示数组中的各元素,数组元素的编号从零开始,所以candy[0],表示candy数组的第一个元素

10.1.1 初始化数组
数组通常被用来储存程序需要的数据
例如:一个内含12个整数元素的数组可以储存12个月的天数,在这种情况下,程序开始就初始化数组比较好
只储存单个值的变量有时也称为标量变量
int fix = 1;
float flax = PI * 2;

C使用新的语法来初始化数组:
int main(void)
{
int powers[8] = {12,45,2413}; /从ANSI C开始支持这种初始化/
}

用以逗号分隔的值的列表(用花括号括起来)来初始化数组,各值之间用逗号分隔,

在逗号和值之间可以使用空格

根据上面的初始化,把1赋给数组的首元素(power【0】),以此类推(不支持ANSI的编译器会把这种形式的初始化识别为语法错误,在数组声明前加上关键字static可解决此问题)

/*打印每个月的天数*/

#include "stdio.h"
#define MONTHS  12

int main()
{
    int static days[MONTHS]={31,28, 30,30,31,30,31,31,30,31,30,31};
    int index;
    for( index = 0; index <MONTHS;index++)
    {
        printf("第%2d个月有%2d天\n",index+1,days[index]);
    }

    return 0;
}
///需要注意的是:数组的元素是用大括号括起来的不是方括号
///宏定义没有分号
/*注意,index起始值是0,第几个月是从1开始,所以输出值的部分要给其+1
逻辑关系要搞清楚*/

程序还不够完善,每四年打错一个月的天数,(即,二月份的天数)。该程序用初始化列表初始化days[],列表(用花括号括起来)中用逗号分隔各值
注意该例使用了符号常量 MONTHS 表示数组大小,这是我们推荐且常 用的做法。例如,如果要采用一年13个月的记法,只需修改#define这行代码 即可,不用在程序中查找所有使用过数组大小的地方。
注意:使用const 声明数组
有时需要把数组为只读。这样,程序只能从数组中检索值,不能把新值写入数组。要创建只读数组,应该使用const 声明和初始化数组。

const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31}; 这样修改后,程序在运行过程中就不能修改该数组中的内容。和普通变 量一样,应该使用声明来初始化 const 数据,因为一旦声明为 const,便不能 再给它赋值。明确了这一点,就可以在后面的例子中使用const了。

未初始化数组的后果:
输出的值是随机的
使用数组前必须先初始化它,与普通变量类似,在使用数组元素之前,必须先给他们赋初值,编译器使用的值是内存相应位置上的现有值

注意:存储类别显示:
数组和其他变量类似,可以把数组创建成不同的存储类别
本章介绍的数组属于自动存储类别:意思是这些数组在函数内部声明,且声明时未使用关键字static
到目前为止,本书所使用的变量和数组都是自动存储类别

在这里提到存储类别的原因是:不同的存储类别有不同的属性,所以不能把本章的内容推广到其他存储类别。对于一些其他存储类别的变量和数组,如果在声明时未初始化,编译器会自动把他们的值设置为零

当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为0,也就是说,如果不初始化数组,数组元素和未初始化的普通变量一样,其中储存的都是垃圾值;但是,如果部分初始化数组,剩余的元素就会被初始化为零
可以省略方括号中的数字,让编译器自动匹配数组大小和初始化列表中的项数

本意是防止初始化值的个数超过数组的大小,让程序找出数组大小
自动计数的弊端:无法察觉初始化列表中的项数有误

你可能感兴趣的:(C语言,c语言)