第 5章 结构体和共用体
5.1 结 构 体
5.2 共 用 体
5.1 结 构 体
5.1.1 结构体的定义结构体定义的一般语法形式为:
struct 结构体名
{
数据类型 成员 1;
数据类型 成员 2;

数据类型 成员 n;
};
注意,定义结构体时,最后的分号不可缺少 。
5.1.2 结构体变量的定义结构体的定义仅仅是给出了该结构体的组成情况,
定义结构体变量可采用以下 3种形式:
( 1) 直接定义直接定义是指在定义结构体的同时定义结构体变量 。 例如:
struct worker
{
char name[10]; //工人姓名
float salary; //工人工资
} worker1,worker2;
( 2) 间接定义间接定义是指先定义结构体,然后再定义结构体变量 。 例如:
struct worker
{
char name[10]; //工人姓名
float salary; //工人工资
};
struct worker worker1,worker2;
( 3) 无名定义当采用直接方式定义结构体变量时,可以省略结构体名 。 例如:
struct
{
char name[10]; //工人姓名
float salary; //工人工资
} worker1,worker2;
注意,无名定义由于省略了结构体名,因此以后不能再用这种结构体类型定义其它结构体变量 。
5.1.3 结构体变量的初始化语法格式为:
struct 结构体名 结构体变量名 ={初值 };
例如:
struct student zhangfan={53101,"zhang
fan",'m',86,92,93}
5.1.4 结构体变量的使用使用结构体变量的语法格式为:
结构体变量,成员名其中,符号,,”是成员运算符,用于访问一个结构体变量中的某个结构体成员 。
【 例 5.1】 设计一个,学生,结构体,包括姓名,性别,年龄,地址等成员 。 然后定义结构体变量并进行初始化,输出显示结果 。
#include<iostream.h>
#include<string.h>
struct student
{
char name[10];
char sex[3];
int age;
char adderss[100];
};
struct student stu1={"李明 ","男 ",22,"北京市 "};
void main()
{
struct student stu1={"李明 ","男 ",22,"北京市 "};
cout<<stu1.name<<'\t'<<stu1.sex<<'\t'<<st
u1.age<<'\t'<<stu1.adderss<<endl;
strcpy(stu1.name,"王芳 ");
strcpy(stu1.sex,"女 ");
stu1.age=20;
strcpy(stu1.adderss,"天津市 ");
cout<<stu1.name<<'\t'<<stu1.sex<<'\t'<<st
u1.age<<'\t'<<stu1.adderss<<endl;
}
程序运行后,输出结果为:
李明 男 22 北京市王芳 女 20 天津市
5.1.5 结构体数组如果数组中的每个元素都是一个结构体变量,则称这样的数组为,结构体数组,。
5.1.5.1 结构体数组的定义结构体数组可以采用 3种定义方式:直接定义,间接定义和无名定义 。 例如:
struct worker
{
char name[10];
float salary;
}workers[2]; //直接定义
struct worker
{
char name[10];
float salary;
};
worker workers[2]; //间接定义
struct
{
char name[10];
float salary;
}workers[2]; //无名定义
5.1.5.2 结构体数组的初始化结构体数组初始化的一般形式为:
struct 结构体名 结构体数组名 []={初值 };
例如:
struct worker
{
char name[10];
float salary;
}workers[2]={{"li ming",800},{"liu
xiang",900}};
【 例 5.2】 从键盘输入学生的学号,姓名以及 3门课程的成绩,保存到结构体数组中,
并且要求用数组成员保存 3门课程的成绩和平均成绩 。 计算每个人 3门课程的平均成绩 。
#include<iostream.h>
#include<stdio.h>
#define n 45
struct student
{
long number;
char name[12];
float score[4];
}stu[n]={{0}};
void input(void);
void caculate(void);
void output(void);
void main()
{
input();
caculate();
output();
}
void input(void)
{
int i;
cout<<"Input the number,name and
scores:\n";
for(i=0;i<n;i++)
{
cout<<i<<" number:";
cin>>stu[i].number;
if(stu[i].number==0) break; //若输入的学号为 0就结束输入
cout<<" name:";
cin>>stu[i].name;
cout<<" yingyu:";
cin>>stu[i].score[0];
cout<<" shuxue:";
cin>>stu[i].score[1];
cout<<" yuwen:";
cin>>stu[i].score[2];
}
}
void caculate(void)
{
int i;
for(i=0;i<n;i++)
{
if(stu[i].number==0) break;
stu[i].score[3]=(stu[i].score[0]+stu[i].s
core[1]+stu[i].score[2])/3;
}
}
void output(void)
{
int i;
for(i=0;i<n;i++)
{
if(stu[i].number==0) break;
cout<<i<<","<<stu[i].number<<"
"<<stu[i].name<<" "<<stu[i].score[0];
cout<<" "stu[i].score[1]<<"
"<<stu[i].score[2]<<" "<<stu[i].score[3]<<endl;
}
}
运行程序,输出结果为:
Input the number,name and scores:
0 number:2004001↙
name:zhangli↙
yingyu:94↙
shuxue:85↙
yuwen:93↙
1 number:2004002↙
name:liufang↙
yingyu:75↙
shuxue:65↙
yuwen:83↙
2 number:0↙ ( 结束输入 )
0,2004001 zhangli 94 85 93 90.6667
1,2004002 liufang 75 65 83 74.3333
注:上面的程序中下划线部分表示键盘输入,↙ 表示回车换行 。
【 例 5.3】 在结构体数组中查找工资值最大的记录 。
#include<iostream.h>
struct person
{
char name[10];
bool sex;
int age;
float salary;
}
struct person a[4]={{"李明 ",1,22,380},{"王强 ",1,34,560},{" 刘刚 ",1,28,450},{" 王霞
",0,26,480}};
void output(int n)
{
cout<<"显示具有 person结构的 "<<n<<"个记录 "<<endl;
for(int i=0;i<n;i++)
{
cout<<a[i].name<<' ';
if(a[i].sex==true)
cout<<"男 "<<' ';
else
cout<<"女 "<<' ';
cout<<a[i].age<<'
'<<a[i].salary<<endl;
}
}
void find(int n)
{
int k=0; //k表示当前具有最大工资值的元素下标
float x=a[0].salary;
for(int i=1;i<n;i++)
{
if(a[i].salary>x)
{
x=a[i].salary;
k=i;
}
}
cout<<endl<<"显示数组 a中具有最大工资值的记录,"<<endl;
cout<<a[k].name<<' ';
if(a[k].sex==true)
cout<<"男 "<<' ';
else
cout<<"女 "<<' ';
cout<<' '<<a[k].age<<'
'<<a[k].salary<<endl;
}
void main()
{
output(4);
find(4);
}
运行程序,输出结果为:
显示具有 person结构的 4个记录李明 男 22 380
王强 男 34 560
刘刚 男 28 450
王霞 女 26 480
显示数组 a中具有最大工资值的记录:
王强 男 34 560
5.2 共 用 体
5.2.1 共用体、共用体变量的定义共用体,共用体变量的定义形式为:
union 共用体名
{
数据类型 成员 1;
数据类型 成员 2;

数据类型 成员 n
}变量列表;
例如:
union example
{
int x;
char y;
double z;
}a,b;
5.2.2 共用体变量的使用
【 例 5.4】 共用体变量的使用 。
#include<iostream.h>
union data
{
char c_data;
short s_data;
long l_data;
};
void main()
{
data x;
x.c_data='m';
cout<< "c_data="<< x.c_data <<endl;
x.s_data=10;
cout<< "s_data="<< x.s_data <<endl;
x.l_data=100l;
cout<< "l_data="<< x.l_data <<endl;
}
运行程序,输出结果为:
c_data=m
s_data=10
l_data=100
使用共用体时应注意以下几点:
( 1) 因为共用体成员采用的是覆盖技术,
因此,每一时刻共用体变量只有一个成员起作用,其他的成员不起作用,即最后一次存放的成员起作用,在存入一个新的成员后原有的成员就失去作用 。
( 2) 共用体变量的地址和它的各成员的地址都是同一地址 。
( 3) 在定义共用体变量时可以进行初始化,
但只能对共用体变量的第一个成员进行初始化 。
( 4) 共用体可以作为结构体的成员,结构体也可作为共用体的成员,也可以定义共用体数组 。