第十一章结构体和共用体 ●概述 定义结构体类型变量的方法 ●结构体变量的引用 ●结构体变量的初始化 ●结构体数组 ●指向结构体类型数据的指针 ●共用体 ●用 typedef定义类型
第十一章 结构体和共用体 ⚫ 概述 ⚫ 定义结构体类型变量的方法 ⚫ 结构体变量的引用 ⚫ 结构体变量的初始化 ⚫ 结构体数组 ⚫ 指向结构体类型数据的指针 ⚫ 共用体 ⚫ 用typedef定义类型
概述 个组合项中包含若干个类型不同(或 相同)的数据项,这样的数据结构称为 结构体 例 10011 Liqi.5 Beijing num name sex age score ddr struct student fint num; char name[20] char sex; int age; float score; char addr[30]
概述 一个组合项中包含若干个类型不同(或 相同)的数据项,这样的数据结构称为 结构体 例: num name sex age score addr struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }; 10011 Li qi M 20 89.5 Beijing
声明结构体类型的一般形式 struct结构体名 成员表列}; 成员表列”称为“域表”,每个成员称 为结构体中的一个域,对各成员(域)的 定义形式如下: 类型名成员名;
⚫ 声明结构体类型的一般形式 struct 结构体名 {成员表列}; “成员表列”称为“域表”,每个成员称 为结构体中的一个域,对各成员(域)的 定义形式如下: 类型名 成员名;
定义结构体类型变量的方法 三种方法: 1.先定义结构体类型,再定义变量名 2.在定义类型的同时定义变量 3.直接定义结构类型变量
定义结构体类型变量的方法 ⚫ 三种方法: 1. 先定义结构体类型,再定义变量名 2. 在定义类型的同时定义变量 3. 直接定义结构类型变量
方法一,假设有如下定义: struct student fint num; char name[20; char sex; int age; float score; char addr[30] 再定义结构体变量stud1和stud2 struct student stud 1. stud2 方法 struct结构体名 成员表列 }变量名表列
⚫ 方法一,假设有如下定义: struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }; 再定义结构体变量stud1和stud2 struct student stud1, stud2; ⚫ 方法二 struct 结构体名 {成员表列 }变量名表列;
方法 struct 成员表列 }变量名表列 对结构体类型的几点说明 1.类型与变量是不同的概念 2.结构体中的成员可以单独引用 3.成员也可以是一个结构体变量(p162~163) 成员名可以与程序中的变量名相同
⚫ 方法三 struct {成员表列 }变量名表列; ⚫ 对结构体类型的几点说明 1. 类型与变量是不同的概念 2. 结构体中的成员可以单独引用 3. 成员也可以是一个结构体变量(p162~163) 4. 成员名可以与程序中的变量名相同
结构体变量的引用 四项原则 1.不能整体输入输出,只能对各个成员分别引用 结构体变量名成员名(成员运算符“) 2.如果成员本身又属于一个结构体类型,则用多 个成员运算符,一级一级地找到最低一级的成 员,只能对最低一级的成员进行赋值、存取及 运算 3.对成员变量可以像普通变量一样进行各种运算 可以引用成员的地址,也可以应用结构体变量 的地址
结构体变量的引用 四项原则 1. 不能整体输入输出,只能对各个成员分别引用 结构体变量名.成员名 (成员运算符“.”) 2. 如果成员本身又属于一个结构体类型,则用多 个成员运算符,一级一级地找到最低一级的成 员,只能对最低一级的成员进行赋值、存取及 运算 3. 对成员变量可以像普通变量一样进行各种运算 4. 可以引用成员的地址,也可以应用结构体变量 的地址
结构体变量的初始化 ●结构体变量和其它类型变量一样,可以在 定义时指定初始值 struct student i unsigned long num char name [301 char sex Int age; float score char native[10] }stUd1={620101," Li Min",M,18,542.5," Shaanxi"};
结构体变量的初始化 ⚫ 结构体变量和其它类型变量一样,可以在 定义时指定初始值 struct student { unsigned long num; char name[30]; char sex; int age; float score; char native[10]; } stud1={620101,"Li Min",'M',18,542.5,"Shaanxi"};
结构体数组 ●定义 只要说明该结构体变量为数组类型,则每 个数组元素都是一个结构体类型数据 初始化 般形式是在定义数组的后面加上: 初值表列}; ●举例(p266例10.2)
结构体数组 ⚫ 定义 只要说明该结构体变量为数组类型,则每 个数组元素都是一个结构体类型数据 ⚫ 初始化 一般形式是在定义数组的后面加上: ={初值表列}; ⚫ 举例(p266例10.2)
例:对候 include 阝3个候选 人,每次吗 字,要求 struct candidate 输出各人 i char name[30] int count 3 leader[3]=[fLi,O),r Zhang,O),tFeng,OJ maino f int i,j; har leader for(=1;i<=10;i++) i gets(leader_ name) for(=0; j<3: j++) if(strcmp(leader_ name, leaderI]- name)==0) leader[]. count++: 1 printf("%s: %d\n",leader[i] name, leader[i]. count
例:对候选人得票的统计程序。设有3 个候选 人,每次输入一个得票的候选人的名字,要求 输出各人得票结果。 #include #include struct candidate { char name[30]; int count; } leader[3]={{"Li",0},{"Zhang",0},{"Feng",0}}; main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { gets(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("%s: %d\n",leader[i].name,leader[i].count); }