第5章 C51的数据结构
在C51语言中,除了整型(int)、浮点型(float)、字符型(char)、无值型(void)4种基本数据类型外,还有以这些基本数据类型为基础而构造成的较复杂的数据结构,即聚合数据类型(aggregate types)。本章将着重介绍C51中的几种聚合数据类型的结构定义及用法,包括数组、指针、结构、联合(共用体)、枚举、位域和自定义数据类型。灵活运用这些数据结构可以简化程序的设计。
5.1 C51的数组
数组是把若干具有相同数据类型的变量按有序的形式组织起来的集合。其中,数组中的每个变量称为数组元素。数组属于聚合数据类型。一个数组可以包含多个数组元素,这些数组元素可以是基本数据类型,也可以是聚合数据类型。
在C51语言中,按照数组元素所属的基本数据类型,数组可分为数值数组、字符数组、指针数组、结构数组等。其中,指针数组将在下文中讲解到指针的部分再作介绍,结构数组将在下文中讲解到结构的部分再作介绍。按照数组的维数,数组又可分为一维数组、二维数组和多维数组。下面分别介绍数组的相关内容。
5.1.1 数组定义及数组元素
数组将多个相同类型的数据放在内存中连续的空间内存储,以便于程序同时调用一批相关数据进行使用。数组与普通变量一样,要先定义才能使用。在定义数组时,除了要注意数组本身的类型说明外,还要注意数组中的各变量的表示,即数组元素的表示。下面分别介绍这两部分的内容。
注意C51数组保存的内容必须是相同类型。
1.数组定义
在C51语言中,使用数组前必须先进行定义,即数组的类型说明。数组定义的一般形式如下。
类型说明符数组名[常量表达式],……;
其中,类型说明符可以是任意一种基本数据类型或聚合数据类型;数组名是用户自定义的数组标识符,相当于变量名;方括号中的常量表达式用于表示数组中元素的个数,即数组的长度。数组声明的示例如下。
int sum[10];//声明整型数组sum,共10个元素
float ax[10],by[20];//声明浮点型数组ax,共10个元素,浮点型数组by,共20个元素
char c1[22];//声明字符数组c1,共22个元素
在程序中定义数组时,应注意以下几点。
❑数组名的命名规则应遵循C51标识符的命名规则。
❑在C51中,可以在同一个类型说明中,同时声明多个相同类型的数组和变量。示例如下。
int a,b,x,y,t[10],c[20];
其中a、b、x和y为整型变量,t和c是整型数组,数组大小分别为10和20。
❑对于同一个数组,其内部所有元素的数据类型都必须是相同的。数组的类型实际上就是数组内数组元素的数据类型。
❑数组名不能与同一函数中的其他变量名相同。如下的数组声明是错误的,程序示例如下。
void main()
{
int c1;//声明整型变量c1
char c1[10];//声明字符型数组c1,命名冲突
……
}
❑在C51中,数组元素的下标从0开始计算,例如a[5]表示数组a中有5个元素。因此,数组a中的5个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]。
❑C51语言不支持动态分配数组空间,因此不能在方括号中用变量来表示元素的个数。如下的数组声明是错误的。
void main()
{
int N=5;//声明并初始化整型变量
char c1[N];//声明字符型数组,数组大小不能为变量
……
}
为了便于根据需要调节数组的大小,可以使用符号常数或常量表达式。程序示例如下。
define SP 5//宏定义
void main()
{
int a[10],b[5+SP];//声明整型数组
……
}
本例中,先宏定义符号常数SP为5,这样就可以在数组定义时,使用SP表示5了。若要改变数组的大小,只要在宏定义中修改SP的值就可以实现了。
提示如上例所示,只要在编译时能确定具体值的表达式,就可用来定义数组的大小,而在编译时不能确定具体值(即在程序运行时才能确定的具体值)的表达式是不能用来定义数组大小的。
2.数组元素表示
数组元素,即数组中的变量,是组成数组的基本单元。在C51中,数组元素是变量,其标识方法为数组名后跟一个下标。数组元素通常也称为下标变量。数组元素表示的一般形式如下所示。
数组名[下标]
其中,下标表示元素在数组中的顺序号,下标只能为整型常量或整型表达式。例如,a[6]、a[i+j]、a[i++]都是合法的数组元素。
在程序中使用数组元素时,应注意以下几点。
❑在C51中必须先定义数组,才能使用数组元素。
❑在使用数组元素时,下标不应该超出数组的大小,否则将造成不可预测的错误。
❑在程序中只能逐个地使用数组元素,而不能一次引用整个数组。例如,要输出一个有20个元素的数组,下面的方法是错误的。
printf(“a=%d”,a);
这里必须使用循环语句逐个输出各下标变量。正确的程序示例如下。
for(i=0;i<20;i++)
{
printf(“a[%d]=%d”,i,a[i]);//循环输出
}
❑与定义数组不同,在引用单个数组元素时,可以使用变量来表示下标标号,但该变量必须有初始值。程序示例如下。
include<stdio.h>//头文件
void main()//主函数
{
int i,a[10];//定义整型变量i和整型数组a
for(i=0;i<10;i++)//循环赋值
a[i]=5*i+1;
for(i=0;i<10;i++)//循环输出结果
printf(“%d”,a[i]);
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
1 6 11 16 21 26 31 36 41 46
在本例中,首先定义整型变量i和整型数组a,其中a有10个数组元素。利用for循环语句为数组a中的数组元素分别赋值,最后再用for循环语句,将数组中的元素逐个输出。