变量:变量分为两种
分类 | 说明 |
---|---|
标量(scalar) | 标亮具有保存单一数据项的能力 |
聚合(aggregate) | 存储数值的集合(数组(array)和结构(structure)) |
8.1 一维数组
说明:数组是含有多个数据值的数据结构,并且每个数据之具有相同的数据类型。这些数据类型的值被称为元素(element)。
声明数组:需要说明数组元素的类型
(任何类型)和数量
(任何整数常量表达式)。
1 | int a[10]; |
技巧:因为程序后面变化时可能需要调整数组的长度,所以较好的方法是用宏来定义数组的长度。
1 |
|
8.1.1 数组下标
说明:为了存取特定的数组元素,可以在写数组名的同时在后迷呐加上一个用方括号围绕的整数值(称这是对数组进行下标(subsvripting)或索引(indexing))。
注意:
a[i]
的表达式格式是左值,所以数组元素可以和普通变量一样使用- 在调用scanf函数读取数组元素时,就像对待普通变量一样,必须使用取地址符号
&
。- c语言不要求检查下标的范围,当下标超出范围时,程序可能执行不可预知的行为。
1 | int a[10], i; |
技巧:避免数组下标的副作用。
1 | //不确定的做法 |
1 | a[0] = 1; |
8.1.2 程序:数列反向
1 | /** |
1 | $ ./reverse |
8.1.3 数组初始化
常量表达式列表规则:
- 列表用
{}
括起来,内部数值用,
分隔- 初始化式完全为空或比数组长度长是非法的,但可以比数组短,此时数组中生育的元素赋值为0
1 | //完整的格式 |
8.1.4 程序:检查数中重复出现的数字
1 | /** |
1 | ./repdigit |
8.1.5 对数组使用sizeof运算符
用途:
- 计算数组的字节数
- 计算数组中每个元素的字节数
- 利用上面的结果计算数组的长度
1 | for(i = 0; i < sizeof(a) / sizeof(a[10]); i++){ |
利用宏:简化用sizeof计算数组长度。更加有效的方式是使用带参数的宏。
1 |
|
8.1.6 程序:计算利息
1 | /** |
1 | $ ./interest |
8.2 多维数组
语法:
m[i][j]
注意:不能把m[i][j]
写为m[i, j]
。c语言把逗号看成是逗号运算符,所以m[i,j]
等同于m[j]
。
地位:和其它编程语言中的多位数组相比, c语言中的多位数组扮演的角色相对较弱,这主要是因为c语言为存储多维数组提供了更加灵活的方法:指针数组。
1 |
|
8.2.1 多为数组的初始化
说明:通过嵌套一维初始化式的方式可以产生二维数组的初始化式。
规则:c 语言提供了多种方法来缩写初始化式。
- 如果初始化式不大到足以填满整个多位数组,那么数组中剩余的元素会被赋值为0。
- 如果内层的列表不大到足以填满数组的一行,那么慈航的剩余元素会被初始化为0。
- 可以忽略掉内层的大括号
注意:在多维数组中忽略掉内层的大括号可能很危险,此外省略括号会引起某些编译器产生警告信息。
1 | //行数不足 |
8.2.2 常量数组
语法:
const 类型 数组名[]
说明:程序不应对声明为const
的数组进行修改。
- 表明程序不会修改数组
- 告知不打算修改数组对编译器发现错误是很有帮助的
8.2.3 发牌
相关函数:
函数 | 所属库 | 说明 |
---|---|---|
time | time.h | 返回当前的时间,且这个时间是被编码成单独的数。 |
srand | stdlib.h | 初始化c语言的随机数生成器 |
rand | stdlib.h | 在每次调用时会产生一个显然随机的数 |
1 | /** |
1 | $ ./deal |