第 11章 结构体与共用体 (4学时)
不同类型的数据组合成一个有机的整体,以便于引用
结构体相当于数据库中的记录
10010 Li Fun M 18 87.5 Chengdu
num name sex age score addr
例如:
1,struct student
2,{int num;
3,char name[20];
4,char sex;
5,int age;
6,float score;
7,char addr[30];
8,};
声明一个结构体类型的一般形式:
struct 结构体
{成员表列};
对各成员都应进行类型声明:
类型名 成员名
1,先声明结构体类型再定义变量名
定义结构体类型变量的方法
struct student student1,student3;
结构体类型名 结构体变量名
2,在声明类型的同时定义变量
例如:
1,struct student
2,{int num;
3,char name[20];
4,char sex;
5,int age;
6,float score;
7,char addr[30];
8,}student1,student2;
定义的一般形式:
struct 结构体

成员表列
}变量名表列;
3,直接定义结构类型的变量
定义的一般形式:
struct

成员表列
}变量名表列;
说明
类型与变量是不同的概念
结构体中的成员可以单独使用,相当于普通变量
成员也可以是一个结构体变量如:
num name sex age
month day year
birthday
addr
1,struct date
2,{int month;
3,int day;
4,int year;};
5,struct student
6,{int num;
7,char name[20];
8,char sex;
9,struct date birthday;
10.char addr[30];
11.}student1,student2;
结构体变量的引用
1,只能对结构体变量中的成员分别访问:
结构体变量名.成员名如,student,num=10010;
不能整体访问!!!
如,printf(“%d,%s,%c,%d,%f,%s”,student1);
2,成员本身又属于一个结构体类型,只能对最低级的成员进行操作如,student,birthday,month=12
注意:不能 student.birthday=12 !!!
3,成员变量可以象普通变量一样进行各种运算如,student1.age++;
sum=student1.score+student2.score;
4,可以引用成员的地址,也可以引用结构体 变量的地址如,scanf(“%d”,&student1.num);
printf(“%o”,&student1);
结构体变量的地址主要用于作函数的参数结构体变量的初始化
1,main( )
2,{struct student
3,{long int num;
4,char name[20];
5,char sex;
6,char addr[30];
7,}a={89031,“Li Lin”,?M?,123 Beijing Road”};
8,printf(“NO.:%ld\nname:%s\nsex:%c\nadd
ress:%s\n”,a.num,a.name,a.sex,a.addr);}
运行结果,No:89031
name:Li Lin
sex,M
address,123 Beijing Road
结构体数组
结构体数组与数值型数组不同之处在于每个数组元素都是一个结构体类型的数据
定义结构体数组
1,struct student
2,{int num;
3,char name[20];
4,char sex;
5,int age;
6,float score;
7,char addr[30];
8,};
struct student stu[3];
也可以直接定义一个结构体数组:
struct student 或 struct
{… {…
}stu[3]; }stu[3];
stu[0]
stu[1]
stu[2]
num name sex age score addr
10101 Li Lin M 18 87.5 103BeijingRoad
10102 Zu Li F 19 99 5ShanghaiRoad
10104 Wu Yu M 20 78.5 2NanjingRoad
结构体数组的初始化
1,struct student
2,{int num;
3,char name[20];
4,char sex;
5,int age;
6,float score;
7,char addr[30];
8,}stu[3]={{10101,“Li Lin”,?M?,18,87.5,
“103BeijingRoad”},{10102,“ZuLi”,?F?,19,99,
“5ShanghaiRoad”},{10104,“Wu Yu”,?M?,
20,78.5,“2NanjingRoad”
10101
Li Lin
M
18
87.5
103BeijingRoad
10102
Zu Li
F
19
99
5ShanghaiRoad
...
stu[0]
stu[1]
stu[2]
数组各元素在内存中连续存放结构体数组应用举例
例 11.2对候选人得票的统计,设有3个候选人,每次输入得票的后选人的名字,要求最后输出各人得票结果
1,#include <string.h>
2,struct person
3,{char name[20];
4,int count;
5,}leader[3]={"Li",0,"Zhang",0,"Fun",0};
1,main( )
2,{int i,j;
3,char leader_name[20];
4,for(i=1;i<=10;i++)
5,{scanf("%s",leader_name);
6,for(j=0;j<3;j++)
7,if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++; }
8,printf("\n");
9,for(i=0;i<3;i++)
10.printf("%5s:%d\n,leader[i].name,leader[i].count);
11,}
共用体
共用体的概念几个不同的变量共占用同一段内存的结构,
称为“共用体”类型。是一种覆盖技术
定义共用体类型变量的一般形式:
union共用体名
{ 成员表列
}变量表列;
例如,1000地址
union data
{int i;
char ch;
float f;
}a,b,c;
共用体变量所占的内存长度等于最长的成员长度(以上 a,b,c各占4个字节)
整型
i 变量字符变量 ch
实 型变 量 f
共用体变量的引用方式
a.i 引用共用体变量中的整型变量 i
a.ch 引用共用体变量中的字符型变量 ch
a.f 引用共用体变量中的实型变量 f
注意:
不能只引用共用体变量:
如,printf(“%d”,a) 错!!!
共用体类型数据的特点
1,同一内存段可以用来存放几种不同类型的成员
2,共用体变量中起作用的成员是最后一次存放的成员
3,共用体变量的地址和它的各成员的地址都是同一地址
4,不能对共用体变量初始化
5,不能把共用体变量作为函数参数
共用体类型可以出现在结构体类型定义中,
也可以定义共用体数组。
枚举类型
如果一个变量只有几种可能的值,可以定义为枚举类型
定义枚举类型
enum 枚举类型名 {枚举常量 1,枚举常量 2,
…,枚举常量 n};
枚举常量的值依次等于:
0,1,2,…n -1
例如:
enum weekday
{sun,mon,tue,wed,thu,fri,sat};
枚举常量的值分别是:
0,1,2,3,4,5,6
枚举常量赋初值:
enum color1
{white,red,yellow=4,black,blue=7};
枚举常量的值分别是:
0,1,4,5,7
枚举型变量的定义
1,先定义枚举类型,后定义变量、数组:
enum color{red,yellow,blue};
enum color color_1,color_2[3];
2,定义枚举类型的同时定义变量:
enum color
{red,yellow,blue} color_1,color_2[3];
3.定义无名枚举类型的同时定义变量:
enum
{red,yellow,blue} color_1,color_2[3];
枚举型变量的引用
1,赋值枚举型变量 =同一种枚举型常量名
enum color
{red,yellow,blue} color_1;
color_1=blue;
color_1=1;
color_1=(enum)1;
2,比较
enum week
{sun,mon,tue,wed,thu,fri,sat} week1[7];
int i,k;
for(i=0;i<7;i++)
week1[i]=(enum week)i;
k=week1[0]<week1[3];
k=week1[4]<week1[1];
k为:真,假
3,循环
enum color
{red,yellow,blue} c_1;
int k=0;
for(c_1=red; c_1<=blue; c_1++) k++;
printf(“k=%d\n”,k);
K值为,3
例:输入两个整数,依次求出它们的和、差、积并输出。
main( )
{enum{plus,minus,times} op1;
int x,y;
scanf(“%d,%d”,&x,&y);
op1=plus;
while(op1<=times)
switch(op1++)
{case plus:printf(“%d+%d=%d”,x,y,x+y);break;
case minus:printf(“%d+%d=%d”,x,y,x-y);break;
case times:printf(“%d+%d=%d”,x,y,x*y);}}
用 typedef类型定义类型
C语言允许用户定义自己习惯的数据类型名称,
来代替系统默认的基础类型名、数组类型名、指针类型名和结构体类型名、共用体类型名、枚举类型名等。
格式,typedef 类型名1 类型名2;
old new
如,1) typedef int INTEGER
2) typedef struct
{int month;
int day;
int year;
} DATE