第12章--结构体和共用体

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C程序设计
例12.2
void 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++; } putchar(‘\n’); for(i=0;i<3;i++) printf(“%s,%d”,leader[i].name,leader[i].count);
C程序设计
12.2.3 结构体数组应用举例
例12.2对候选人得票的统计程序。设有3个候选人,每 次输入一个得票的候选人的名字,要求最后输出各人得 票结果。 #include <string.h> #include <stdio.h> struct person { char name[20]; int count; } leader[3]={“Li”,0,”Zhang”,0,”Fun”,0};
12.3.1 指向结构体变量的指针变量
下面通过一个简单例子来说明指向结构体变量的指针变 量的应用。
C程序设计
例12.3通过指向结构体变量的指针变量输出该结构体 运行结果: 变量的信息。
#include <string.h> name:LiLin #include <stdio.h> sex:M void main() {struct student{long num;char name[20]; score:89.500000 No.:89101 char sex; float score;}; name:LiLin struct student stu_1; sex:M struct student* p; p=&stu_1; score:89.500000 stu_1.num=89101;strcpy(stu_1.name,”LiLin”); stu_1.sex=‘M’;stu_1.score=89.5; printf(“%d,%s,%c,%f”,stu_1.num,stu_1.name,stu_1.sex,st u_1.score);
§12.2 结构体数组
一个结构体变量中可以存放一组数据(如一个 学生的学号、姓名、成绩等数据)。如果有 10个学生的数据需要参加运算,显然应该 用数组,这就是结构体数组。结构体数组与 以前介绍过的数值型数组不同之处在于每个 数组元素都是一个结构体类型的数据,它们
都分别包括各个成员(分量)项。
C程序设计
C程序设计
12.1.4 结构体变量的初始化 例12.1 对结构体变量初始化. 但不能用以下语句整体读入结构体变量,
#include <iostream.h> 例如: 运行结果: void main() No. :10101 scanf(″%d,% s,% c,%d,%f,% {struct student s″,& student1 ); name :LiLin {long int num; char name[20]; sex:M address:123 Beijing char sex; 结构体变量的地址主要用作函数参数, char addr[20] ; Road 传递结构体变量的地址。 }a={10101,″LiLin″,′M′,″123 Beijing Road″}; /* 对结构体变量a赋初值*/ printf(“%d,%s,%c,%s”,&a.num,a.name,&a.sex,a.ad dr); } C程序设计
例如: 对上面定义的结构体变量student1, 可以这样访
student1.birthday来 访问student1变量中 的成员birthday,因为 birthday本身是一个 结构体变量。
问各成员:
student1.num
student1.birthday.month
C程序设计
(3) 对结构体变量的成员可以像普通变量一样 由于“.”运算符的 进行各种运算(根据其类型决定可以进行 优先级最高,因此 的运算)。 student1.age++是 例如: 对student1.age进 student2.score=student1.score; 行自加运算,而不是

C程序设计
12.1.2

定义结构体类型变量
可以采取以下3种方法定义结构体类型变量 : (1)先声明结构体类型再定义变量名
例如:struct
student
student1, student2;
| 结构体类型名
| | 结构体变量名
100102 WangLi F 20 98 Beijing student1定义了 student1和student2为struct student类

C程序设计
引用结构体变量中成员的方式为
结构体变量名.成员名
例如, student1.num表示student1变量中的num成员, 即student1的num(学号)项。可以对变量的成员 赋值,例如:student1.num=10010;“.”是成员(分 量)运算符,它在所有的运算符中优先级最高,因
7.2.1 定义结构体数组
和定义结构体变量的方法相仿,只需说明 其为数组即可。例如: struct student {int num; char name[20];char sex; int age; float score;char addr[30]; 以上定义了一个数 }; 组stu,数组有3个 struct student stu[3]; 元素,均为struct student类型数据。
型的变量,即它们具有 100101 ZhangXin struct M 19 student 90.5 类型的结构 Shanghai . student2
图12-2
C程序设计
在定义了结构体变量后,系统会为之分配内存单元。 例如:student1和student2在Turbo C的内存中各占59个 字节(2+20+1+2+4+30=59)。
此可以把student1.num作为一个整体来看待。上
面赋值语句的作用是将整数10010赋给student1 变量中的成员num。
C程序设计
(2) 如果成员本身又属一个结构体类型 ,则要用若干个成 注意: 员运算符,一级一级地找到最低的一级的成员。只 能对最低级的成员进行赋值或存取以及运算。
不能用
printf(“%d,%s,%c,%f”,(*p).num,(*p).name,(*p).sex,(*p). score)); C程序设计 }
No.:89101
图12-5
C程序设计
以下3种形式等价:
① 结构体变量.成员名 ②(*p).成员名 ③ p->成员名
图12-4
Байду номын сангаасC程序设计
当然,数组的初始化也可以用以下形式: struct student 结构体数组初始化的一般形 {int num; 式是在定义数组的后面加上 … “={初值表列};”。
}; struct student
str[]={{…},{…},{…}};
即先声明结构体类型,然后定义数组为该 结构体类型,在定义数组时初始化。
如:struct student
{ int num; char name[20]; char sex; int age; 成员名 float score; char addr[30];
C程序设计
类型名
};
说明:
(1)结构体类型并不是只有一种,而是可以设计出许多 种结构体类型. (2)成员也可以是一个结构体变量。如加上birthday。 (3)“结构体”这个词是根据英文单词structure译出的
12.1.3 引用结构体变量
在定义了结构体变量以后,当然可以引用 这个变量。但应遵守以下规则: (1)同类的结构体变量可以互相赋值,如: student1=student2; 不能将一个结构体变量作为一个整体进 行输入和输出。 例如: 已定义student1和student2为结构体变 量并且它们已有值。 printf(“%d”student1); scanf(“%d”,&student1);
第12章 结构体和共用体
C程序设计
本章主要内容

12.1 结构体类型
12.2 结构体数组
12.3 结构体指针


12.4 共用体
12.5 枚举类型 12.6 用typedef命名类型 12.7 链表
C程序设计
12.1 结构体类型

12.1.1 结构体类型的定义 12.1.2 结构体变量的定义与初始化 12.1.3 结构体变量的引用
C程序设计
§12.1 结构体类型和结构体变量
12.1.1 结构体类型 问题定义:
有时需要将不同类型的数据组合成一个有机
的整体,以便于引用。如: 一个学生有学号/姓名/性别/年龄/地址等属性
int num; char name[20];char sex;
Num
name
int age;
sex
age
它的作用与第一 种方法相同,即 定义了两个 struct student 类型 的变量 student1, student2
C程序设计
(3) 不指定类型名而直接定义结构体类型变量
其一般形式为: 注意: struct { (1) 结构体类型与结构体变量 成员表列 (2) 结构体类型中的成员名可 }变量名表列; 即不出现结构体名。 以与程序中的变量名相同,但二 (3) 对结构体变量中的成员( 即“域”),可以单独使用, 它的作用与地位相当于普通变 量。 C程序设计
先对age进行自加运 sum=student1.score+student2.score;
student1.age++;
++student2.age;
算。
C程序设计
(4) 可以引用结构体变量成员的地址,也可以 引用结构体变量的地址。 例如: • scanf(“%d”,&student1.num); (输入student1.num的值) • printf(“%x”,&student1); (输出student1的首地址)
(2)在声明类型的同时定义变量
这种形式的定义的一般形式为:
struct

结构体名
成员表列
}变量名表列;
C程序设计
例如:
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;
化。例如:
struct student
{int num;char name[20]; char sex;
int age; float score; char addr[30]; }stu[2]={{10101,″LiLin″,′M′,18, 87.5,″103 BeijingRoad″},{10102, ″Zhang Fun″,′M′,19,99,″130 Shanghai Road″}};
int char addr[30];
score addr
应当把它们组织成一个组合项,在一个组合 100101 Li Fun M 18 87.5 Beijing 项中包含若干个类型不同(当然也可以相同) 图12-1 的数据项。
C程序设计

声明一个结构体类型的一般形式为: struct 结构体名 结构体名 {成员表列};
C程序设计
也可以直接定义一个结构体数组,例如: struct student {int num; …} stu[3];
student stu[3];
或:
strcut {int num; …} stu[3]; 图12-3
C程序设计
12.2.2 结构体数组的初始化
与其他类型的数组一样,对结构体数组可以初始
Fun↙ Zhang Zhang ↙ Li↙ Fun↙ Zhang Li↙ Li:4 Zhang Fun:3
C程序设计
§12.3 结构体指针
结构体指针是指向结构体数据的指针,一个结构体变量 的起始地址就是这个结构体变量的指针。指针变量既可以指
向结构体变量,也可以用来指向结构体数组中的元素。但是
,指针变量的基类型必须与结构体变量的类型相同。 例如: struct student *pt;
相关文档
最新文档