
9第章用户自己建立数据类型
9 用户自己建立数据类型 第 章

定义和使用结构体变量
定义和使用结构体变量

struct结构体名自己建立结构体类型【成员表列C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。在程序中建立一个结构体类型:结构体类型的名字是由一个关键字struct和结addrnumsexagenamescore构体名组合而成的。结构体名由用户指定,又10010M1887.5LiFangBeijing称结构体标记”(structuretag)。structStudent花括号内是该结构体所包括的子项,称为结构//学号为整型int num;体的成员(member)。对各成员都应进行类型声//姓名为字符串charname[20]char sex;//性别为字符型明,即类型名成员名:1/年龄为整型intage;成员表列”(memberlist)也称为域float score;1/成绩为实型//地址为字符串表”(fieldlist),每一个成员是结构体中的一个charaddr[30]7://注意最后有一个分号域。成员名命名规则与变量名相同
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。 在程序中建立一个结构体类型: 自己建立结构体类型 struct 结构体名 {成员表列}; struct Student { int num; //学号为整型 char name[20]; //姓名为字符串 char sex; //性别为字符型 int age; //年龄为整型 float score; //成绩为实型 char addr[30]; //地址为字符串 }; //注意最后有一个分号 num name sex age score addr 10010 Li Fang M 18 87.5 Beijing 结构体类型的名字是由一个关键字struct和结 构体名组合而成的。结构体名由用户指定,又 称“结构体标记”(structure tag) 。 花括号内是该结构体所包括的子项,称为结构 体的成员(member)。对各成员都应进行类型声 明,即 “成员表列”(member list)也称为“域 表”(field list),每一个成员是结构体中的一个 域。成员名命名规则与变量名相同。 类型名 成员名;

自己建立结构体类型(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,各自包含不同的成员。birthday(2)成员可以属于另一个结构体类型。addrnumnamesexagemonthdayyearstructDate1/声明一个结构体类型structDate1/月intmonth;1/日int day:1/年intyear,1;struct Student//声明一个结构体类型structStudentint num;char name[20]char sex,intage://成员birthday属于structDate类型structDatebirthday,char addr[30];1;
自己建立结构体类型 (1) 结构体类型并非只有一种,而是可以设计出许多种结构体类型,各自包含不同的成员。 (2) 成员可以属于另一个结构体类型。 struct Date //声明一个结构体类型 struct Date { int month; //月 int day; //日 int year; //年 }; struct Student //声明一个结构体类型 struct Student { int num; char name[20]; char sex; int age; struct Date birthday; //成员birthday属于struct Date类型 char addr[30]; }; num name sex age birthday addr month day year

定义结构体类型变量1.先声明结构体类型,再定义该类型的变量2.在声明类型的同时定义变量structStudentstruct结构体名structStudent1/学号为整型intnum;intnum;成员表列//姓名为字符串charname[20]char name[20]变量名表列;1/性别为字符型char sex,charsex;1/年龄为整型intageintage:float score;floatscore;//成绩为实型char addr[30]://地址为字符串charaddr[30]1://注意最后有一个分号Jstudent1,student23.不指定类型名而直接定义结构体类型变量structStudentstudent1,student2struct结构体类型名结构体变量名成员表列390.510001Zhang XinM19Shanghaisutdentl:变量名表列:20Wang Li98Beijingstudent2:10002L
定义结构体类型变量 1. 先声明结构体类型,再定义该类型的变量 2. 在声明类型的同时定义变量 struct Student student1, student2; 3. 不指定类型名而直接定义结构体类型变量 | | | 结构体类型名 结构体变量名 struct Student { int num; //学号为整型 char name[20]; //姓名为字符串 char sex; //性别为字符型 int age; //年龄为整型 float score; //成绩为实型 char addr[30]; //地址为字符串 }; //注意最后有一个分号 sutdent1: 10001 Zhang Xin M 19 90.5 Shanghai student2: 10002 Wang Li F 20 98 Beijing struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1, student2; struct 结构体名 { 成员表列 }变量名表列; struct { 成员表列 }变量名表列;

定义结构体类型变量(1)结构体类型与结构体变量是不同的概念,不要混淆。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3对结构体变量中的成员(即域”),可以单独使用,它的作用与地位相当于普通变量
定义结构体类型变量 (1) 结构体类型与结构体变量是不同的概念,不要混淆。只能对变量赋值、存取或运算,而不能对一个类 型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。 (2) 结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。 (3) 对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量

结构体变量的初始化和引用【例9.1】把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。口C\WINDOWS)system32/cmd.exeX#include:10101int main()name:Li Linsex:l//声明结构体类型structStudentstructStudentress:123.BeijingRoadlong int num;//以下4行为结构体的成员char name[20]charsex,charaddr[20]:la=[10101"LiLin"M123BeijingRoad://定义结构体变量a并初始化printf("NO.%ld/nname:%sinsex:%clnaddress:%sin",a.num,a.name.a.sex.a.addr):return 0:
结构体变量的初始化和引用 【例9.1】把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出 这个学生的信息。 #include int main() { struct Student //声明结构体类型struct Student { long int num; //以下4行为结构体的成员 char name[20]; char sex; char addr[20]; }a={10101,"Li Lin",'M',"123 Beijing Road"}; //定义结构体变量a并初始化 printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr); return 0; }

结构体变量的初始化和引用(1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。注意对结构体变量初始化,不是对结构体类型初始化(2)可以引用结构体变量中成员的值,引用方式为结构体变量名.成员名student1.num=10010;/+已定义了student1为student类型的结构体变量,则student1.num表示studentl变量中的num成员,即student1的num(学号)成员*/”是成员运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待,相当于一个变量。printf("%sIn",student1)://企图用结构体变量名输出所有成员的值不能企图通过输出结构体变量名来达到输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入和输出
结构体变量的初始化和引用 (1) 在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量 依次赋给结构体变量中的各成员。 (2) 可以引用结构体变量中成员的值,引用方式为 “. ”是成员运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看 待,相当于一个变量。 不能企图通过输出结构体变量名来达到输出结构体变量所有成员的值。只能对结构体变量中的各个 成员分别进行输入和输出。 结构体变量名.成员名 student1.num=10010; /*已定义了student1为student类型的结构体变量,则student1.num表示student1 变量中的num成员,即student1的num(学号)成员*/ printf(″%s\n″,student1); //企图用结构体变量名输出所有成员的值 注意 对结构体变量初始化,不是对结构体类型初始化

结构体变量的初始化和引用(3)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。student1.num=10010//结构体变量student1中的成员numstudent1.birthday.month=6://结构体变量student1中的成员birthday中的成员month(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。1/赋值运算student2.score=student1.score;//加法运算sum=student1.score+student2.score://自加运算student1.age++;(5)同类的结构体变量可以互相赋值。student1=student2://假设student1和student2已定义为同类型的结构体变量(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址(结构体变量的地址主要用作函数参数,传递结构体变量的地址)。但不能用以下语整体读入结构体变量。//输入student1.num的值scanf("%d,%s,%c,%d,%f,%sn",&student1);scanf("%d",&student1.num)//输出结构体变量student1的起始地址printf("%o",&student1);
结构体变量的初始化和引用 (3) 如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。 只能对最低级的成员进行赋值或存取以及运算。 (4) 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。 (5) 同类的结构体变量可以互相赋值。 (6) 可以引用结构体变量成员的地址,也可以引用结构体变量的地址(结构体变量的地址主要用作函数参 数,传递结构体变量的地址)。但不能用以下语句整体读入结构体变量。 student1.num=10010; //结构体变量student1中的成员num student1.birthday.month=6; //结构体变量student1中的成员birthday中的成员month student2.score=student1.score; //赋值运算 sum=student1.score+student2.score; //加法运算 student1.age++; //自加运算 student1=student2; //假设student1和student2已定义为同类型的结构体变量 scanf(″%d″,&student1.num); //输入student1.num的值 printf(″%o″,&student1); //输出结构体变量student1的起始地址 scanf(″%d,%s,%c,%d,%f,%s\n″,&student1);

结构体变量的初始化和引用【例9.2】输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。#includeintmainostructStudent//声明结构体类型structStudentint num;1char name[20]:floatscore:Jstudent1,student2;//定义两个结构体变量student1,student2scanf("%d%s%f".&student1.num,student1.name&student1.score))://输入学生1的数据scanfc%d%s%f&student2.num,student2.name&student2.score)://输入学生1的数据printf(c"The higher score is:In"):if(student1.score>student2.score)printf("%d%s%6.2f\n",student1.num,student1.name,student1.score)elseif(student1.score<student2.score)printf("%d %s%6.2f/n",student2.num,student2.name,student2.score);elseprintf("%d %s %6.2f/n",student1.num,student1.name,student1.score);printf("%d %s%6.2f/n",student2.num,student2.name,student2.score):C\WINDOWS)system32)cmd.exe口X710110103Ling90return 0:The higher score is:90.00103Lne
结构体变量的初始化和引用 【例9.2】输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。 #include int main() { struct Student //声明结构体类型struct Student { int num; char name[20]; float score; }student1,student2; //定义两个结构体变量student1,student2 scanf("%d%s%f",&student1.num,student1.name,&student1.score); //输入学生1的数据 scanf("%d%s%f",&student2.num,student2.name,&student2.score); //输入学生1的数据 printf("The higher score is:\n"); if(student1.score>student2.score) printf("%d %s %6.2f\n",student1.num,student1.name,student1.score); else if(student1.score<student2.score) printf("%d %s %6.2f\n",student2.num,student2.name,student2.score); else { printf("%d %s %6.2f\n",student1.num,student1.name,student1.score); printf("%d %s %6.2f\n",student2.num,student2.name,student2.score); } return 0; }