首页 理论教育高级语言中的数据类型和结构体

高级语言中的数据类型和结构体

【摘要】:高级语言中引入数据类型的概念来解决这一问题。在高级语言中,定义变量就是指明该变量的数据类型,从而为该变量分配相应数据类型的内存单元空间。结构体是不同数据类型的集合。

由于不同类型的数值占用内存单元的大小不同,所以高级语言在进行变量定义时,要具体指出该变量要存放数值的类型。高级语言中引入数据类型的概念来解决这一问题。在高级语言中,定义变量就是指明该变量的数据类型,从而为该变量分配相应数据类型的内存单元空间。

例如,C语言规定,整数有三种数据类型,分别是长整数、整数和短整数,长整数用符号long(或long int)表示,整数用符号int表示,短整数用符号short(或short int)表示。其中,int数据类型占用4个字节,由于4个字节可表示的数据范围是﹣32768~+32767,所以,定义为int数据类型变量的数据范围是﹣32768~+32767,当定义为int数据类型的变量超出了这个范围,数据就会出错,其程序也就必然会出错。long数据类型占用8个字节,所以,定义为long数据类型的变量可表示的数据范围,就远大于定义为int数据类型的变量可表示的数据范围。

在高级语言中,数据类型通常分作基本数据类型和构造数据类型两种。

1.基本数据类型

一般来说,高级语言的数据类型包括整数数据类型、实数数据类型和字符数据类型。为节省内存单元空间,整数数据类型又进一步细分为长整数、整数和短整数三种子类型,实数数据类型又分作单精度和双精度两种子类型。7.2.3节我们还要讨论构造结构的数据类型。由于构造结构的数据类型是由这里讨论的简单数据类型构成的,所以为区别起见,我们也称这里讨论的简单数据类型为基本数据类型。

为有效和正确地进行程序设计,程序设计人员在定义变量时,首先要根据问题分清该变量应是整数、实数和字符数据类型的哪一种,然后还要根据问题分清该变量应是哪种子数据类型。如果把所有变量都按占最大内存单元空间的子数据类型来定义,当然程序运行时不会出错,但是浪费的内存资源很多;如果把所有变量都按占最小内存单元空间的子数据类型来定义,当然内存资源会很节省,但是一旦数据超过该数据类型所允许的数据范围,则程序运行时就会出错。所以,定义变量时,数据类型(特别是子数据类型)的选择要合适。

在高级语言中,数据类型不仅用来确定数据(或变量)所要占用的内存单元大小,还用来进行操作的匹配性检查。例如,假设有如下C语言语句:

int n;

n=5.5;

上述程序段中,第一行语句定义了一个int类型的变量,第二行语句是给变量n赋一个单精度的实数数值5.5,而一个只有4个字节内存单元的整数类型变量中,是无法存放需要8个字节内存单元空间的单精度实数数值的,因此系统需要在运行该程序前对该语句提出可能存在错误或可能引起错误的警告,并在实际运行时,只把单精度实数数值5.5的整数部分赋值给变量n。

总结上述讨论,我们可以得出如下结论:

(1)数据类型是高级语言定义变量(即为变量分配具体大小的内存单元)的需要。

(2)数据类型是系统用来检查高级语言程序中表达式计算或变量赋值等是否匹配的需要。

为下面举例说明方便,这里我们给出C语言中基本数据类型的表示符号:

整数:长整数为long(或long int),整数为int,短整数为short(或short int);

实数:单精度实数为float,双精度实数为double;

字符:char。

2.构造数据类型

现实世界中有很多事物的属性是密切相关的,程序设计中反映这些事物属性的数据也应该密切相关。例如,描述学生的数据有学号、姓名、性别、年龄等,一个学生的这些数据应该组成一个整体。构造数据类型为程序设计人员提供了把现实世界中有密切联系的数据组织成一个整体的工具。

构造数据类型是在基本数据类型的基础上构造出来的数据类型。数组和结构是大多数高级语言都支持的两种最主要的构造数据类型。

(1)数组。数组是相同数据类型的集合。例如,在C语言中,假设我们要使用10个int型的变量,可以定义如下:

int v1,v2,v3,v4,v5,v6,v7,v8,v9,v10;(www.chuimin.cn)

为和数组类型的变量区别,我们也称这里定义的变量为简单变量。由于上述10个变量的类型相同,所以,也可以把这10个变量定义成一个数组。不同的高级语言定义数组和表示数组元素的方法略有不同,但基本原理都相同。在定义变量时,C语言用变量名后加符号“[]”来表示所定义的变量为数组类型的变量。如:

int v[10]

上述语句定义了包含10个变量的数组类型变量。数组变量中的一个变量称作一个数组元素。C语言规定数组元素的序号从0开始,所以10个数组元素分别是:v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9]。由于一个数组变量包含了若干个数组元素,所以高级语言在实现时,是给每个数组变量分配内存地址连续的内存单元块。如数组变量v的内存单元分配示意图如图7-1所示。每个数组元素占4个字节,所以总计占用了40个字节。

图7-1 数组变量的内存单元分配

由于一个数组变量是由若干个数组元素组成的一个整体,所以数组类型既可以简化变量的定义,还可以方便程序设计。例如,如果上述10个数组元素的数组变量中保存了要累加的数值,在编写循环形式的累加时,就可以把循环体写成sum=sum+v[i],其中,数组下标i从0增加到9。

(2)结构体。结构体是不同数据类型的集合。结构体用来表示有若干个分量的一个事物。例如,在登记一个学生的信息时,需要登记学生的姓名、年龄、平均成绩等信息。我们希望把描述一个学生各个属性的信息表示成一个有逻辑联系的整体,这样既可以简化变量的定义,也可以使程序更容易看懂。结构体就可以达到这个目的。

不同的高级语言表示结构体的方法不同。在C语言中,上述学生结构体可以定义如下:

struct student

{

char name[8];

int age;

float average;

};

上述语句称作结构体定义,结构体定义是指根据问题的需要,利用基本数据类型定义一种新的数据类型。其中,student为这个结构体的名,name、age和average是该结构体的三个分量。在上述定义之后,就可以像用数据类型int定义变量一样,用结构体student来定义结构体变量。例如,结构体变量可以定义如下:

student s;

由于一个结构体变量包含了若干个分量,所以高级语言在实现时,是给每个结构体变量分配内存地址连续的内存单元块。如结构体变量s的内存单元分配示意图如图7-2所示。char类型占1个字节,name分量为char类型的有8个元素的数组,共计占用了8个字节:int数据类型占4个字节,所以age分量占4个字节;float数据类型占8个字节,所以average分量占8个字节。因此,总计占用了20个字节。

图7-2 结构体变量的内存单元分配

在上述结构体变量S定义之后,我们就可以用如下三个赋值语句给该变量的三个分量分别赋值:

s.name=″张三″

s.age=22;

s.average=89.9;