没有合适的资源?快使用搜索试试~ 我知道了~
C语言程序设计要点 2017-11-071
需积分: 0 0 下载量 163 浏览量
2022-08-03
17:59:12
上传
评论
收藏 854KB PDF 举报
温馨提示
试读
19页
1.值列表长度大于数组指定长度是个错误 2.试图用单值将数组所有元素初始化为相同值是办不到的 1.数组查找
资源详情
资源评论
资源推荐
1
数组
7.1 问题引入
在前面几章的解决方案中,设计了学生基本信息的存储方案。例如得分是这样来声明的:
int score;
然而,这单个的变量只能保存一个学生的得分信息,实际情况却是需要 30 名学生的信息。因
此,不得不声明 30 个类似的变量来存储所有人的得分情况,它们的声明可能是这样的:
int score1;
int score2;
…
int score30;
那么在输入得分信息时,会用到这样一系列语句:
scanf(“%d”, &score1);
scanf(“%d”, &score2);
…
scanf(“%d”, &score30);
也许 30 条这样的语句并不算多。但如果参赛学生增多了,达到了数百个,那么还能用这样的
方式吗?
也许读者会想到这样的方案,用一个循环输入得分,其代码如下:
for (i = 0; i < NUM; ++i) scanf(“%d”, &scorei);
然而不幸的是,这样做并不能达到目的:编译器不能自动将读者认为正确的组合 scorei 扩
展为 score1、score2 等变量名,而是视它为单个变量名!这在逻辑上显然是不正确的。
仔细分析一下需要处理的这些变量,可以发现它们都拥有相同的特征:其一,这些数据具有
明显的聚集性;其二,它们都用于描述不同对象的相同属性,有相同的数据类型,也有相同的处
理方式。借用数学上的术语,它们是“齐次”的。
对于具有这样性质的数据,几乎所有的高级语言都提供了有效的解决方案,这就是数组
(array)。简而言之,数组是具有相同属性的对象的有限有序集合。数组中,对象(称为“数组元
素 element
”
)的数目是有限的,并且按顺序排列,每个对象(除首尾外)都有且仅有一个直接前
驱,也有且仅有一个直接后继。数组元素使用相同的命名规则,这使得程序员可以用相同的方式
处理这些元素,从而减少了代码的重复。
数组按照其组织方式可以分为一维数组、二维数组以及多维数组等。在本章中主要讨论一维
和二维数组。
7.2 一维数组
7.2.1 一维数组的声明
一维数组的声明方式为:
基类型 数组名[长度];
2
其中,基类型可以是任意合法类型;长度是一个整型常量表达式,说明了数组中有多少个元
素;数组中的每一个元素都具有基类型。例如:
int a[5];
以上声明定义了一个数组变量,名字为 a,是一维的,有 5 个元素,每个元素都是整型的。
上述声明在声明一个数组的同时,还声明了一个数组类型,该类型可以描述为:
int [5]
可以看到,数组类型修饰符由两部分组成,并且分别出现在变量名的前后;相较之下,其他
类型修饰符(函数除外)一般都出现在变量名的前面。
考察两个数组变量是否具有相同的类型(即可比较的)要看它们的 3 个指标:维数、每一维
的长度、基类型。例如有如下声明。
int c[5], d[5], e[10];
float f[5];
那么 c 和 d 的类型是相同的、可比较的;而 c 和 f 则不同,
d 和 e 也不同。
数组具有这样一些特性:
数组的基类型可以是任意合法的类型,包括内建类型和
用户自定义类型,甚至仍是一个数组。
数组一旦声明,那么数组名就被视为常量,因此不能被
更改。
C 数组的长度是固定的,一旦确定就不能更改。
一维数组在内存中是顺序存放的,元素是两两相邻的。
例如数组 a,它的存储结构如图 7-1 所示。
可以看到,一维数组是一种线性结构,它主要用于存储按线
性方式排列的数据。
数组名是一个常量,因此数组变量本身不是一个左值,所以单独的数组名不能出现在赋值号
的左边。
对数组的整体赋值和输入、输出是错误的。例如:
int a[10], b[10]; //ok
b = a; //error, b
不是左值
scanf(“%d”, a); //error
printf(“%d”, b); //error
如果要对数组进行赋值或输入、输出,那么必须对单个的数组元素进行操作。
7.2.2 一维数组元素的使用
数组元素是组成数组的基本单元,同时也是一种变量,其标识方法为数组名后跟一个该元素
在数组中的索引号。数组元素的表示形式为:
数组名[索引]
其中,索引(index)常称为“下标”,是元素在数组中的序号,可以是整型常量或整型表达式。
C 语言规定,数组的下标从 0 开始计数。例如有声明:
int a[10];
int i = 2;
图 7-1 数组的顺序存储结构
3
float b = 1.5;
那么 a[0]、a[i]、a[2+3]都是合法的数组元素表示;而 a[b]就是错误的。
可以这样来理解数组元素:a[i]是一个变量的名字,它的类型是整型。既然是一个变量,那
么它就是一个左值,可以出现在赋值号的两边。
由于 C 数组的下标是从 0 开始的,因此下标的最大值应该是数组的长度减 1。如上面定义的数组 a,
它的最大下标是 9。下标值超过了 9 或者小于 0 的现象称为“下标越界”,例如 a[10]。但很遗憾的
是,因为 C 语言没有把数组当作一个完整的对象来对待,而只是把它当作一个内存块,所以 C 语言
中没有检测下标是否越界的机制。因此,在使用数组时,一定要注意下标是否超出了界限。
【例 7-1】数组元素的使用:输入和输出数组元素。
//7-1.c
#include <stdio.h>
int main()
{
int a[10];
int i;
printf("Please input 10 integers:\n");
for (i = 0; i < 10; ++i)
scanf("%d", &a[i]); //
注意这种用法
printf("The elements are following:\n");
for (i = 0; i < 10; ++i)
printf("a[%d]=%d\n", i, a[i]);
return 0;
}
程序的运行结果是:
Please input 10 integers:
2 6 5 9 0 7 4 8 1 3
↙
The elements are following:
a[0]=2
a[1]=6
a[2]=5
a[3]=9
a[4]=0
a[5]=7
a[6]=4
a[7]=8
a[8]=1
a[9]=3
从例中可以看到,数组的连续存储结构和统一的命名规则使得对它的处理和循环结构紧密相
关。一般地,处理 n 维数组需要 n 重循环。
一般地,将数组元素从头到尾访问一遍的过程称为“数组的遍历(traverse)”。遍历数组是
经常用到的一项数组操作,在后面的例子中都可以看到它的应用。
剩余18页未读,继续阅读
Friday永不为奴
- 粉丝: 14
- 资源: 317
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0