Rose
第五章
复杂构造数据类型结构体与共用体
1 概述
的数据类型组合在一起表达一个整体的信息。
例如:描述一个学生的完整信息时,有学号、姓名、年龄、成绩、家庭地址等项。
这些项目之间是彼此联系的,应组织定义成一个组合项,统一表示和使用,见下例:
结构体类型举例
学号姓名性别年龄成绩家庭地址
int num char
name[8]
char
sex
int
age
float
score
char
addr[20]
9001李华女2086济南某一个学生的具体信息表示:
结构体类型定义
这种由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型,相当于其它语言中描述的“记录”。
结构体类型在使用之前应先定义其类型结构,然后再定义该类型变量,才能使用。如上实例:
济南大学
Rose
结构体类型定义:struct student
{ int num;
char name[8];
char sex;int age; float score;char addr[20];};
关键字数据项(成员)
结构体描述:学号
姓名
性别年龄成绩
家庭地址int num char name[8]char sex int age float
score
char
addr[20]自己命名的结构体类型名
济南大学Rose 定义有n个成员的结构体类型的一般形式:
struct结构体类型名
{
类型标识符1成员名1;
类型标识符2 成员名2;
…..…….
类型标识符n 成员名n;
};
说明:1、用{ } 将成员扩起来。
2、成员的类型可以是任意类型,称为一个域或一个数据项。注意此处是类型名,不是变
量名。
济南大学
Rose
2定义结构体变量
注意前面定义的student 同int 、char 等一样只是类型的名字,不是结构体变量,不能直接使用,需由此
类型继续定义结构体变量才能使用,步骤:先定义一个结构体类型,再定义变量。
struct 结构体类型名变量名列表;
注:关键字struct 与结构体类型标识符一起使用。
例:struct student stu1, stu2,stu[50];
已定义的
类型名
济南大学
Rose
定义了结构体变量后,系统为之分配内存单元,结构体的各成员在内存中是按顺序连续存放的,所以结构体变量在内存中占据的字节数是各个成员的长度和,如stu1变量占据内存字节数为2+8+1+2+4+20=37。
学号姓名性别年龄成绩
家庭地
址int num
char name[8]char sex int age
float score
char addr[20]
济南大学Rose 还可以用如下方法定义结构体变量:
2、定义类型的同时定义结构体变量:
例如:
struct 结构体类型名
{
类型标识符1 成员名1;
类型标识符2 成员名2;
…………
类型标识符n 成员名n; }变量名表;例:
struct note
{
char name[20]; char sex; char addr[20]; char tel[8];
} txl1, txl2;
济南大学Rose
3、直接定义结构体类型变量:
例如:
struct
{
类型标识符1 成员名1;
类型标识符2 成员名2;
…………
类型标识符n 成员名n; } 变量名表;例:
struct
{
char name[20]; char sex; char addr[20]; char tel[8];
} txl1, txl2;
注意:不出现类型名
济南大学Rose struct date
{ int month;
int day;
int year;
}
struct student
{ int num;
char name[8];
char sex;
int age;
struct date birthday;
3 结构体变量的引用
结构体变量名.成员名
成员运算符
一般来说, 在程序设计中不直接引用结构体变量,而是引用结构体变量的某个成员变量1、成员的引用形式为:
成员运算符优先级最高。
例: struct student stu1;
引用成员stu1.num=9002;
gets(https://www.doczj.com/doc/be9664856.html,);
stu1.sex=…m? ;
printf(“%d,%d”,stu1.num,https://www.doczj.com/doc/be9664856.html,);
2、结构体变量使用说明
1.结构体变量通常不能整体使用,不能整体
输入、输出,只能对单个成员分别引用。
但当结构体变量作为函数参数或赋初值时,可以整体输入;或者两个相同类型的结构体变量,如果一个已经赋值,可以对另外一个整体赋值。
如果student1已被赋值,则可以:
2、结构体变量使用说明
2.如果成员本身又属于一个结构体类型,
则这个成员也不能整体赋值,要用若干各成员运算符引用,如前面的birthday
成员本身又是date类型的变量,则需stu1.birthday.month=4;
stu1.birthday.day=5;
stu1.birthday.year=1998;
举例:
编程输入一个班级的30名同学信息,统计来自山东的学生人数。学生信息由以下几项组成:
学号,姓名,性别,籍贯
济南大学Rose 程序主要步骤:
1、定义数据类型,结构体类型student。
2、定义该类型的数组cai0801,长度30。
3、循环程序,输入30名同学信息。
循环次数:30次,固定次数的循环。
循环体内容:⑴依次为每个元素的各个成员输入数据。⑵比较籍贯成员项的数据是否为
“山东”,如果是,则计数器加1.
4、输出统计后的count值。
济南大学Rose struct student
{char num[11];
char name[8];
char sex;
char addr[20];
};
main()
{ struct student cai0801[10];
int i,count=0;
printf(“input 30 students information:\n”);
for(i=0;i<30;i++)
{ gets(cai0801[i]num); gets(cai0801[i].name);
getchar(cai0801[i].sex); gets(cai0801[i].addr);
if(strcmp(cai0801[i].addr,“山东”)==0)
count++;
}
printf(“%d come from 山东\n”);
4 结构体变量的初始化
可以在定义结构体变量的同时, 对其初始化例:struct student
{ long int num;char name[20];char sex;char addr[20];
}a={9001, “曹名”,‘m?, “123 北京路”};
说明:{ }和,一一对应
:
a.num=9001;strcpy(https://www.doczj.com/doc/be9664856.html,, “曹名”);
a.sex=…m?;
strcpy(a.addr, “123 北京路”);
5、结构体数组的定义及初始化
例1:struct student
{ int num;
char name[20];
char sex;
float score;
char addr[20];
}stu[3]={{10101,”Li Lin”,?M?,87.5,”103
Beijing”},{10102,”Zu Feng”,
?F?,98,”130 Shanghai”},
{10103,”Wang Mi”,?M?,78,