
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.8 信息携带者:定义一个结构体
在程序设计中,经常需要将多个数据项组合在一起作为一个数据元素。例如,一个学生的信息包括姓名、学号、性别、年龄、分数等。此时可以将学生的信息定义为结构体类型。

训练1-35:输入一个学生的信息(包括姓名、学号、性别、年龄、分数)并输出。


有时为了方便,会使用typedef给结构体起一个别名(小名):

使用typedef有什么用处?typedef是C、C++语言的关键字,用于给原有数据类型起一个别名。
语法规则如下:

其中,“类型名称”为已知数据类型,包括基本数据类型(如int、float等)和用户自定义的数据类型(如用struct自定义的结构体);“类型标识符”是为原有数据类型起的别名,需要满足标识符命名规则。就像给某个人起一个小名或绰号一样,《三国演义》中李逵的绰号是“黑旋风”,大家听到“黑旋风”就知道是李逵。
使用typedef的好处如下。
(1)简化比较复杂的类型声明。给复杂的结构体类型起一个别名,这样就可以使用这个别名等价该结构体类型,在声明该类型变量时就方便多了。
(2)提高程序的可移植性。例如,在程序中使用这样的语句:

在程序中就可以直接定义:

在程序中,假如有n个地方用到了ElemType类型,比如现在处理的数据变为字符类型了,就可以将上面类型定义中的int直接改为char:

这样只需修改类型定义,无须改动程序中的代码。如果不使用typedef类型定义,就需要把程序中n个用到int类型的地方,全部改为char类型。如果忘记修改某处,就会发生错误。
使用ElemType是为了让算法的通用性更好,因为很多时候结构体定义并不指定处理的数据是什么类型,不能简单地将其写成某种类型。将ElemType结合typedef使用,可以提高算法的通用性和可移植性。