高级程序设计语言吴 凡
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第十一章 结构体与共用体电子科技大学通信与信息工程学院引例
有时需要将 不同类型 的数据组合成一个有机整体
例:一个学生信息:
学号 (int num),
姓名 (char name[]),
成绩 (float score)
结构体:若干数据类型(可以不同)的集合
属于构造类型 —— 需要用户定义结构体类型电子科技大学通信与信息工程学院定义结构体类型
格式:
struct 结构体类型名 {
类型说明 成员名;
类型说明 成员名;
...
}
例:
struct关键字,不能省略可省略:无名结构体成员类型可以是基本类型,也可以是构造类型
struct student{
int number;
char name[10];
float score;
}
电子科技大学通信与信息工程学院定义结构体变量
方法 1:先定义结构体类型,再定义结构体变量
一般形式:
struct 结构体类型名 {
成员列表
};
struct 结构体类型名 变量名 ;
例,struct student{
int number;
char name[10];
float score;
};
struct student stu1,stu2;
电子科技大学通信与信息工程学院定义结构体变量
方法 2:定义结构体类型的同时定义结构体变量
一般形式:
struct 结构体类型名 {
成员列表
} 变量名列表 ;
例,struct student{
int number;
char name[10];
float score;
}stu1,stu2;
电子科技大学通信与信息工程学院定义结构体变量
方法 3:直接定义结构体变量
一般形式:
struct {
成员列表
} 变量名列表 ;
例:
struct{
int number;
char name[10];
float score;
}stu1,stu2;
电子科技大学通信与信息工程学院定义结构体变量
注意:
结构体变量的成员在连续内存空间中存储
结构体类型与结构体变量的区别:
先定义结构体类型,再定义结构体变量
定义 结构体类型 时 不 需要 分配空间,
定义 结构体变量 时才 分配空间
结构体类型可以 嵌套 定义:结构体成员类型可以是一个结构类型
结构体成员名 与 结构体变量 可以同名
struct date{
int month;
int day;
int year;
};
struct student{
int number;
char name[10];
float score;
struct date birthday;
}stu1,stu2;
int number
char name[10]
float score
int month
int day
int year
电子科技大学通信与信息工程学院结构体变量的引用
引用形式:结构体变量名,成员名
规则:
对结构体变量的引用(包括赋值、输入、输出、
运算等)只能通过结构变量的成员来实现,而不能结构体变量视为一个整体来处理。
例外:具有 相同类型 的结构变量可以相互赋值
例,stu1.num = 22;
printf("student's name %s\",stu1.name);
stu1 = stu2;
电子科技大学通信与信息工程学院结构体变量的引用
规则:
如果是结构体类型是嵌套定义的,需要使用成员员算符(,)逐级引用
例,stu1.num = 10;
stu1.birthday.month = 10;
stu1.birthday.day = 1;
结构体变量的 成员 可以像普通变量一样运算
例,stu1.age++; stu1.scor += 20;
可以引用 结构体变量成员 的地址,也可以引用结构体变量 的地址电子科技大学通信与信息工程学院结构体变量的初始化
在定义结构体变量时赋初值
例,struct student{
int number;
char name[10];
float score;
};
struct student stu1={112,"Wang Lin",90.5};
电子科技大学通信与信息工程学院结构体数组
结构体数组:数组每一个元素都是一个结构体类型的变量
定义形式:与定义结构体变量的形式相似 (3种形式 )。
struct student{
int number;
char name[10];
float score;
};
struct student stu1[10];
struct student{
int number;
char name[10];
float score;
}stu1[10];
struct{
int number;
char name[10];
float score;
}stu1[10];
电子科技大学通信与信息工程学院结构体数组
结构体数组在内存中,连续存放
struct student{
int number;
char name[10];
float score;
};
struct student stu [3]={
{2,"Wang Lin",90.5 },
{10,"Zhang San",92.5},
{18,"Li Si",89}};
2 stu[0]
Wang Lin
90.5
10 stu[1]
Zhang San
92.5
18 stu[2]
Li Si
89
电子科技大学通信与信息工程学院结构体数组
例:统计候选人选票
struct person{
char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Wang",0};
main()
{ int i,j;
char leader_name[20];
for(i=1; i<=10; i++){
scanf("%s",leader_name);
for(j=0; j<3; j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
Li leader[0]
0
Wang
0
Zhang
0
leader[1]
leader[2]
电子科技大学通信与信息工程学院结构体和指针
结构体变量的指针:该结构体变量所占内存的首地址
结构体指针变量
定义,struct 结构体类型 *指针变量名;
例,struct student stu1,*p = &stu1;
引用:
(*p).成员名
p->成员名电子科技大学通信与信息工程学院结构体和指针

main()
{ struct student{
long int num;
char name[20];
char sex;
float score;
} stu1,*p;
p = &stu_1;
stu_1.num=89101;
strcpy(stu_1.name,"Li Lin");
p->sex = 'M';
p->score = 89.5;
printf("No:%ld\n",(*p).num);
printf("name:%s\n",p->name);
printf("sex:%c\nscore:%f\n",stu_1.sex,p->score);
}