第十一章 结构体与共用体第一节 结构体数据类型的定义与引用一般形式:
struct 结构体名
{
成员列表
} ;
类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
不能省略例,struct student
{
int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
};
/*学号 */
/*姓名 */
/*年龄 */
/*性别 */
/*年级 */
/*家庭地址 */
1.结构体类型变量的定义和引用方法 1 先定义结构,再说明结构变量
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
};
struct student student1,student2;
02705201
chaplin
20
M
2
shanghai
02705202
mary
19
F
2
nanjing
student1 student2
方法 2 在定义结构体的同时说明结构变量
struct 结构体名
{ 类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
} 变量名列表 ;
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
} student1,student2;
方法 3 直接说明结构变量
struct
{ 类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
} 变量名列表 ;
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
} student1,student2;
2)结构体类型的成员可以又是一个构造类型,
即构成了嵌套的结构注意,
如,一个地址可以由邮编和住址组成,
struct address
{ int code;
char add[10];
};
struct student
{ int number;
struct address home;
};
number
home
code add[10]
1)结构体变量可以分为局部变量和全局变量规则:
1)不能把一个结构体变量进行输入和输出
2.结构体类型数据的引用如,printf(“%d,%s,%d,%c,%d,%s”,student1);
引用方式,结构体变量名,成员名如,printf(“%d,%s,%d,%c,%d,%s”,
student1.number,
student1.name,
student1.age,
student1.sex
student1.grade,
student1.address);
规则:
2)若成员本身又是一个结构,则必须逐级找到最低级的成员才能使用如,前面提到的嵌套结构
student3.home.code 即 student3的邮编
student3.home.add 即 student3的住址
3)结构体变量成员,与相同类型的普通变量并无区别,可以像不同变量一样参与各种运算例,
student1.number=02705201;
sum=student1.number+student2.number;
student1.age++;
strcpy(student3.home.add,“nanjing”);
3.结构体变量的初始化方法 1 定义时指定初始值
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
};a={0308,“lili”,20,? F?,2,“nanjing”};
main()
{
printf(“%d\n,%s\n,%d\n,%c\n,%s\n”,
a.number,a.name,a.age,a.sex,a.address); }
方法 2 定义时未指定初始值
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
}a,b;
a.numbre=0308;
a.name[0]=?l?;a.name[1]=?i?;… …
a.age=20;
a.sex=?M?;
a.address[0]=?n?; a.address[1]=?a?;… …
b=a;
例,
#include,stdio.h”
main()
{
struct date
{ int year,month,day;
}today;
printf(“%d\n”,sizeof(struct date));
} 6
第二节 结构体数组
struct 结构体名
{ 成员列表
} 数组名 [长度 ];
一般形式:
例,
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
}a[2];a[2]={
{0308,“lili”,20,? F?,,nanjing”},
{0309,“davie”,21,? M?,,shanghai”}
};
0308
davie
20
M shanghai0309
lili
21
F nanjinga[0]
a[1]
number name age sex address
习题例 1:
main()
{ struct cmplx{ int x;
int y;
}con[2]={1,3,2,7};
printf(“%d\n”,con[0].y/con[0].x*con[1].x);
}
6
习题例 2,试利用结构体类型编制一个程序,实现输入一个学生的期中和期末成绩,然后计算出其平均成绩例 3,若上题改为输入 3个学生的学号、数学期中和期末成绩,然后计算出他们各自平均成绩,
并输出成绩表习题习题例 4,设有 3个人,Li_ming,Wang_hui,Zhang_ming
分别时 18,19,20岁,用结构体类型编程,要求输出三个人中年龄居中者的年龄和姓名第三节 共用体 ——联合
1.共 用体类型的定义一般形式:
union 共用体名
{ 成员列表 ;
} 共用体变量名 ;
方法 1:
union data
{ int i;
char ch;
float f;
}a,b,c;
方法 2,
union data
{ int i;
char ch;
float f;
};
union data a,b,c;
方法 3:
union
{ int i;
char ch;
float f;
}a,b,c;
四个字节
a
2.共 用体变量的引用方式 —— 先定义,后引用
1)不能引用共用体变量而只能引用它的成员如,前面定义了 a,b,c共用体变量
a.i /*引用共用体变量中的整型变量 i*/
a.ch /*引用共用体变量中的字符变量 ch*/
a.f /*引用共用体变量中的实型变量 f*/
如,不能只引用共用体变量
printf(“%d”,a);
2)共用体不能作为函数参数或函数值,但可以使用指向共用体的指针变量
3.共 用体类型的数据特点
1)共用一段内存,可以用来存放几种不同类型的成员,但每一瞬时只有一个成员起作用
2)共用体变量中前一次起作用的成员在存入新的成员后原有的成员失去意义如,a.i=1;
a.ch=?a?;
a.f=1.5; /*只有 a.f有意义,a.i,a.ch被覆盖 */
共 用体类型的数据特点
3)共用体变量和它的所有成员的地址都是同一地址
4)不能对共用体变量名赋值,也不能在定义共用体变量时对它进行初始化如 1,union data
{ int i;
char ch;
float f;
}a={1,?a?,1.5}; /*不能初始化 */
如 2,a=1; /*不能对共用体变量赋值 */
如 3,m=a; /*不能引用共用体变量名 */
共 用体类型的数据特点
5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体类似)
6)共用体数组共用体类型中可以有结构体变量作为其成员,
结构体类型中也可以有共用体变量作为其成员例 1:
union data
{
int i;
char ch;
float f[20];
}b;
b占用内存字节为 80
例 2:
main()
{ union EXAMPLE
{ struct { int x;
int y;
}in;
int a;
int b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(“%d,%d\n”,e.in.x,e.in.y};
} 4,8
第四节 枚举类型
1.枚举,指把变量的值一一列举出来,变量的值只能限于列举出来的范围内如,
enum weekday{ sum,mon,tue,wed,thu,fri,sat};
枚举元素枚举常量枚举类型
enum weekday week_end,workday;
1.枚举数据的特点:
1)枚举元素是常量,不能给他们赋值如,sum=2;
2)枚举元素是常量,C语言编译时按定义时的顺序,使它们的值分别为 0,1,2,…,6
如,week_end=sat;
printf(“%d”,week_end);
输出结果为 6
枚举数据的特点:
3)但是,可以改变枚举元素的值如,
enum weekday
{ sum=7,mon=1,tue,wed,thu,fri,sat};
则 tue的值为
wed的值为
thu的值为
fri的值为
sat的值为
2
3
4
5
6
枚举数据的特点:
4)枚举值可以用来作比较判断比较规则:按定义时的顺序来比较,若未人为指定,则第一个枚举元素的值为 0
如,if(week_end<=fri)
if(mon>thu)
枚举数据的特点:
5)一个整数要赋值给一个枚举常量,则必须进行类型转换如 1,workday=2;
如 2,workday=(enum weekday)2;
workday=tue;
第五节 用 typedef定义类型用 typedef定义新的类型名来代替已有的类型名如 1,typedef int INTEGER;
INTEGER i,j;
int i,j;
注意,
1) typedef用来定义类型名,但不能用来定义变量
2)不能创建新类型 typedef 类型名 标识符
3)可以作为简化变量的类型说明注意,
如 1,typedef struct student{… } REC;
REC x,y,*p;
struct student x,y,*p;
例,
typedef int INT
main()
{ INT a,b;
a=5;b=6;
printf(“%d,%d\n”,a,b);
{ float INT;
INT=3.0;
printf(“2*INT=%.2f”,2*INT);
}
}
5,6
2*INT=6.0
struct 结构体名
{
成员列表
} ;
类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
不能省略例,struct student
{
int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
};
/*学号 */
/*姓名 */
/*年龄 */
/*性别 */
/*年级 */
/*家庭地址 */
1.结构体类型变量的定义和引用方法 1 先定义结构,再说明结构变量
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
};
struct student student1,student2;
02705201
chaplin
20
M
2
shanghai
02705202
mary
19
F
2
nanjing
student1 student2
方法 2 在定义结构体的同时说明结构变量
struct 结构体名
{ 类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
} 变量名列表 ;
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
} student1,student2;
方法 3 直接说明结构变量
struct
{ 类型说明 成员 1;
类型说明 成员 2;
… …
类型说明 成员 n;
} 变量名列表 ;
struct student
{ int number;
char name[31];
short age;
char sex;
int grade;
char address[10];
} student1,student2;
2)结构体类型的成员可以又是一个构造类型,
即构成了嵌套的结构注意,
如,一个地址可以由邮编和住址组成,
struct address
{ int code;
char add[10];
};
struct student
{ int number;
struct address home;
};
number
home
code add[10]
1)结构体变量可以分为局部变量和全局变量规则:
1)不能把一个结构体变量进行输入和输出
2.结构体类型数据的引用如,printf(“%d,%s,%d,%c,%d,%s”,student1);
引用方式,结构体变量名,成员名如,printf(“%d,%s,%d,%c,%d,%s”,
student1.number,
student1.name,
student1.age,
student1.sex
student1.grade,
student1.address);
规则:
2)若成员本身又是一个结构,则必须逐级找到最低级的成员才能使用如,前面提到的嵌套结构
student3.home.code 即 student3的邮编
student3.home.add 即 student3的住址
3)结构体变量成员,与相同类型的普通变量并无区别,可以像不同变量一样参与各种运算例,
student1.number=02705201;
sum=student1.number+student2.number;
student1.age++;
strcpy(student3.home.add,“nanjing”);
3.结构体变量的初始化方法 1 定义时指定初始值
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
};a={0308,“lili”,20,? F?,2,“nanjing”};
main()
{
printf(“%d\n,%s\n,%d\n,%c\n,%s\n”,
a.number,a.name,a.age,a.sex,a.address); }
方法 2 定义时未指定初始值
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
}a,b;
a.numbre=0308;
a.name[0]=?l?;a.name[1]=?i?;… …
a.age=20;
a.sex=?M?;
a.address[0]=?n?; a.address[1]=?a?;… …
b=a;
例,
#include,stdio.h”
main()
{
struct date
{ int year,month,day;
}today;
printf(“%d\n”,sizeof(struct date));
} 6
第二节 结构体数组
struct 结构体名
{ 成员列表
} 数组名 [长度 ];
一般形式:
例,
struct student
{ int number;
char name[31];
short age;
char sex;
char address[10];
}a[2];a[2]={
{0308,“lili”,20,? F?,,nanjing”},
{0309,“davie”,21,? M?,,shanghai”}
};
0308
davie
20
M shanghai0309
lili
21
F nanjinga[0]
a[1]
number name age sex address
习题例 1:
main()
{ struct cmplx{ int x;
int y;
}con[2]={1,3,2,7};
printf(“%d\n”,con[0].y/con[0].x*con[1].x);
}
6
习题例 2,试利用结构体类型编制一个程序,实现输入一个学生的期中和期末成绩,然后计算出其平均成绩例 3,若上题改为输入 3个学生的学号、数学期中和期末成绩,然后计算出他们各自平均成绩,
并输出成绩表习题习题例 4,设有 3个人,Li_ming,Wang_hui,Zhang_ming
分别时 18,19,20岁,用结构体类型编程,要求输出三个人中年龄居中者的年龄和姓名第三节 共用体 ——联合
1.共 用体类型的定义一般形式:
union 共用体名
{ 成员列表 ;
} 共用体变量名 ;
方法 1:
union data
{ int i;
char ch;
float f;
}a,b,c;
方法 2,
union data
{ int i;
char ch;
float f;
};
union data a,b,c;
方法 3:
union
{ int i;
char ch;
float f;
}a,b,c;
四个字节
a
2.共 用体变量的引用方式 —— 先定义,后引用
1)不能引用共用体变量而只能引用它的成员如,前面定义了 a,b,c共用体变量
a.i /*引用共用体变量中的整型变量 i*/
a.ch /*引用共用体变量中的字符变量 ch*/
a.f /*引用共用体变量中的实型变量 f*/
如,不能只引用共用体变量
printf(“%d”,a);
2)共用体不能作为函数参数或函数值,但可以使用指向共用体的指针变量
3.共 用体类型的数据特点
1)共用一段内存,可以用来存放几种不同类型的成员,但每一瞬时只有一个成员起作用
2)共用体变量中前一次起作用的成员在存入新的成员后原有的成员失去意义如,a.i=1;
a.ch=?a?;
a.f=1.5; /*只有 a.f有意义,a.i,a.ch被覆盖 */
共 用体类型的数据特点
3)共用体变量和它的所有成员的地址都是同一地址
4)不能对共用体变量名赋值,也不能在定义共用体变量时对它进行初始化如 1,union data
{ int i;
char ch;
float f;
}a={1,?a?,1.5}; /*不能初始化 */
如 2,a=1; /*不能对共用体变量赋值 */
如 3,m=a; /*不能引用共用体变量名 */
共 用体类型的数据特点
5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体类似)
6)共用体数组共用体类型中可以有结构体变量作为其成员,
结构体类型中也可以有共用体变量作为其成员例 1:
union data
{
int i;
char ch;
float f[20];
}b;
b占用内存字节为 80
例 2:
main()
{ union EXAMPLE
{ struct { int x;
int y;
}in;
int a;
int b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(“%d,%d\n”,e.in.x,e.in.y};
} 4,8
第四节 枚举类型
1.枚举,指把变量的值一一列举出来,变量的值只能限于列举出来的范围内如,
enum weekday{ sum,mon,tue,wed,thu,fri,sat};
枚举元素枚举常量枚举类型
enum weekday week_end,workday;
1.枚举数据的特点:
1)枚举元素是常量,不能给他们赋值如,sum=2;
2)枚举元素是常量,C语言编译时按定义时的顺序,使它们的值分别为 0,1,2,…,6
如,week_end=sat;
printf(“%d”,week_end);
输出结果为 6
枚举数据的特点:
3)但是,可以改变枚举元素的值如,
enum weekday
{ sum=7,mon=1,tue,wed,thu,fri,sat};
则 tue的值为
wed的值为
thu的值为
fri的值为
sat的值为
2
3
4
5
6
枚举数据的特点:
4)枚举值可以用来作比较判断比较规则:按定义时的顺序来比较,若未人为指定,则第一个枚举元素的值为 0
如,if(week_end<=fri)
if(mon>thu)
枚举数据的特点:
5)一个整数要赋值给一个枚举常量,则必须进行类型转换如 1,workday=2;
如 2,workday=(enum weekday)2;
workday=tue;
第五节 用 typedef定义类型用 typedef定义新的类型名来代替已有的类型名如 1,typedef int INTEGER;
INTEGER i,j;
int i,j;
注意,
1) typedef用来定义类型名,但不能用来定义变量
2)不能创建新类型 typedef 类型名 标识符
3)可以作为简化变量的类型说明注意,
如 1,typedef struct student{… } REC;
REC x,y,*p;
struct student x,y,*p;
例,
typedef int INT
main()
{ INT a,b;
a=5;b=6;
printf(“%d,%d\n”,a,b);
{ float INT;
INT=3.0;
printf(“2*INT=%.2f”,2*INT);
}
}
5,6
2*INT=6.0