第 9 章 结构体

19
9 9 第第第第

Upload: bella

Post on 11-Jan-2016

152 views

Category:

Documents


3 download

DESCRIPTION

第 9 章 结构体. 短整型 short. 整 型. 整型 int. 长整型 long. 单精度型 float. 基本类型. 实型. 双精度型 double. 字符类型 char. C 数 据 类 型. 数组. 结构体 struct. 构造类型. 共用体 union. 枚举类型 enum. 指针类型. 空类型 void. 定义类型 typedef. 只能定义单一的数据类型,反映事物单一属性. 如定义学生成绩: float score;. 能定义复杂的数据类型,反映事物多个属性. 如定义学生信息: struct STU { - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 9 章   结构体

第第 99 章 章 结构体结构体

Page 2: 第 9 章   结构体

CC数数据据类类型型

指针类型指针类型

空类型空类型 voidvoid

定义类型定义类型 typedeftypedef

构造类型构造类型

枚举类型枚举类型 enumenum

数组数组结构体结构体 structstruct

共用体共用体 unionunion

基本类型基本类型

字符类型字符类型 charchar

实型实型单精度型单精度型 floatfloat

双精度型双精度型 doubledouble

整 型整 型短整型短整型 shortshort

长整型长整型 longlong

整型整型 intint

只能定义单一的只能定义单一的数据类型,反映数据类型,反映事物单一属性事物单一属性

只能定义单一的只能定义单一的数据类型,反映数据类型,反映事物单一属性事物单一属性

如定义学生成绩:如定义学生成绩: float score;float score;

如定义学生成绩:如定义学生成绩: float score;float score;

能定义复杂的数能定义复杂的数据类型,反映事据类型,反映事

物多个属性物多个属性

能定义复杂的数能定义复杂的数据类型,反映事据类型,反映事

物多个属性物多个属性

如定义学生信息:如定义学生信息:struct STUstruct STU{{ char no[9]; char no[9]; //// 学号学号 char name[12]; char name[12]; //// 姓名姓名 char sex; char sex; //// 性别性别 float score; float score; //// 成绩成绩} student;} student;

如定义学生信息:如定义学生信息:struct STUstruct STU{{ char no[9]; char no[9]; //// 学号学号 char name[12]; char name[12]; //// 姓名姓名 char sex; char sex; //// 性别性别 float score; float score; //// 成绩成绩} student;} student;

Page 3: 第 9 章   结构体

9.1 结构体 结构体是一种构造数据类型结构体是一种构造数据类型 用途:用途:把不同类型的数据组合成一个整体把不同类型的数据组合成一个整体 -------------- 自自定义数据类型定义数据类型 引入结构体的好处:引入结构体的好处:加强数据项之间的联系加强数据项之间的联系

如学生的基本信息,包括学号、姓名、性别、年龄、班如学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。 侧面。

no name

sex age classno

grade

独立的变量表示:独立的变量表示:

数据项之间无关联数据项之间无关联

no name sex age classno grade结构体变量表示:结构体变量表示:

数据项为一个整体数据项为一个整体

char no[9]; char no[9]; //// 学号学号char name[20]; char name[20]; //// 姓名姓名char sex; char sex; //// 性别性别unsigned int age; unsigned int age; //// 年龄年龄unsigned int classno; unsigned int classno; //// 班级班级float grade; float grade; //// 成绩成绩

char no[9]; char no[9]; //// 学号学号char name[20]; char name[20]; //// 姓名姓名char sex; char sex; //// 性别性别unsigned int age; unsigned int age; //// 年龄年龄unsigned int classno; unsigned int classno; //// 班级班级float grade; float grade; //// 成绩成绩

Page 4: 第 9 章   结构体

11 、结构体类型的定义、结构体类型的定义

structstruct [ [ 结构体类型名结构体类型名 ]]{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; 数据类型名数据类型名 2 2 成员名成员名 22 ;; … … … … 数据类型名数据类型名 n n 成员名成员名nn ;;}} ;;

structstruct [ [ 结构体类型名结构体类型名 ]]{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; 数据类型名数据类型名 2 2 成员名成员名 22 ;; … … … … 数据类型名数据类型名 n n 成员名成员名nn ;;}} ;;

structstruct 是是关键关键字字 ,,不能省略不能省略

structstruct 是是关键关键字字 ,,不能省略不能省略

合法标识符合法标识符可省可省 :: 无名结构无名结构体体

合法标识符合法标识符可省可省 :: 无名结构无名结构体体

成员类型可以是成员类型可以是基本型或构造型基本型或构造型成员类型可以是成员类型可以是基本型或构造型基本型或构造型

以分号以分号 ;; 结结尾尾 以分号以分号 ;; 结结尾尾 例例 11 ::

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩};};

例例 11 ::struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩};};

例例 22 ::struct Datestruct Date{{ int year; int year; //// 年年 int month; int month; //// 月月 int day; int day; //// 日日};};

例例 22 ::struct Datestruct Date{{ int year; int year; //// 年年 int month; int month; //// 月月 int day; int day; //// 日日};};

Page 5: 第 9 章   结构体

在结构体中数据类型相同的成员,既可逐个、逐行分别在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行定义,就象一次定义多个变量一样。 定义,也可合并成一行定义,就象一次定义多个变量一样。

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩};};

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩};};

struct Student_Infostruct Student_Info{{ char no[9], name[20], sex;char no[9], name[20], sex; unsigned int age, classno;unsigned int age, classno; float grade; float grade; };};

struct Student_Infostruct Student_Info{{ char no[9], name[20], sex;char no[9], name[20], sex; unsigned int age, classno;unsigned int age, classno; float grade; float grade; };};

struct Datestruct Date{{ int year; int year; //// 年年 int month; int month; //// 月月 int day; int day; //// 日日};};

struct Datestruct Date{{ int year; int year; //// 年年 int month; int month; //// 月月 int day; int day; //// 日日};};

struct Datestruct Date{{ int year, month, day;int year, month, day;};};

struct Datestruct Date{{ int year, month, day;int year, month, day;};};

注意:结构类型只是用户自定义的一种数据类型,注意:结构类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式用来定义描述结构的组织形式 ,, 不分配内存,只有用它不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。所占内存的大小是它所包含的成员所大小的内存单元。所占内存的大小是它所包含的成员所占内存大小之和。占内存大小之和。

注意:结构类型只是用户自定义的一种数据类型,注意:结构类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式用来定义描述结构的组织形式 ,, 不分配内存,只有用它不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。所占内存的大小是它所包含的成员所大小的内存单元。所占内存的大小是它所包含的成员所占内存大小之和。占内存大小之和。

Page 6: 第 9 章   结构体

struct Student_Infostruct Student_Info{{ char no[9], name[20], sex;char no[9], name[20], sex; unsigned int age, classno;unsigned int age, classno; float grade; float grade; };};struct Student_Info student;struct Student_Info student;

struct Student_Infostruct Student_Info{{ char no[9], name[20], sex;char no[9], name[20], sex; unsigned int age, classno;unsigned int age, classno; float grade; float grade; };};struct Student_Info student;struct Student_Info student;

例:例:

22 、结构体变量的定义和引用、结构体变量的定义和引用

struct struct 结构体类型名结构体类型名{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; … … … … 数据类型名数据类型名 n n 成员名成员名 nn ;;}} ;;struct struct 结构体类型名 变量名列表;结构体类型名 变量名列表;

struct struct 结构体类型名结构体类型名{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; … … … … 数据类型名数据类型名 n n 成员名成员名 nn ;;}} ;;struct struct 结构体类型名 变量名列表;结构体类型名 变量名列表;

结构体变量的定义结构体变量的定义 间接定义法:间接定义法:先定义结构类型,再定义结构变量先定义结构类型,再定义结构变量

…………

99 字字节节2020 字节字节

11 字字节节22 字字节节22 字字节节

44 字字节节

nono

namename

sexsex

ageage

classnoclassno

gradegrade

内存映像内存映像(BC(BC 下下 ))

Page 7: 第 9 章   结构体

struct struct student; student;struct struct student; student;

struct Student_Info struct Student_Info student1, student2;student1, student2;struct Student_Info struct Student_Info student1, student2;student1, student2;

一次定义多个结构体类型变量一次定义多个结构体类型变量

定义指向结构体类型的指针变量定义指向结构体类型的指针变量

struct Student_Info struct Student_Info *pstu;*pstu;struct Student_Info struct Student_Info *pstu;*pstu;

※ 间接定义法中几种错误的结构体变量的定义方法间接定义法中几种错误的结构体变量的定义方法

没有结构体类型名 没有结构体类型名 没有结构体类型名 没有结构体类型名

Student_InfoStudent_Info student; student; Student_InfoStudent_Info student; student; 缺省缺省 structstruct 关键关键字字 缺省缺省 structstruct 关键关键字字

struct Pointstruct Point p; p;struct Pointstruct Point{{ int x, y;int x, y;};};

struct Pointstruct Point p; p;struct Pointstruct Point{{ int x, y;int x, y;};};

结构类型结构类型 PointPoint 定定义在后义在后 结构类型结构类型 PointPoint 定定义在后义在后

Page 8: 第 9 章   结构体

22 、结构体变量的定义和引用、结构体变量的定义和引用

structstruct [ [ 结构体类型名结构体类型名 ]]{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; … … … … 数据类型名数据类型名 n n 成员名成员名 nn ;;} } 变量名列表变量名列表;;

structstruct [ [ 结构体类型名结构体类型名 ]]{{ 数据类型名数据类型名 1 1 成员名成员名 11 ;; … … … … 数据类型名数据类型名 n n 成员名成员名 nn ;;} } 变量名列表变量名列表;;

结构体变量的定义结构体变量的定义 直接定义法:直接定义法:定义结构体类型的同时定义结构体变定义结构体类型的同时定义结构体变量量

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student1, student2student1, student2;;

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student1, student2student1, student2;;

structstruct{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student1, student2student1, student2;;

structstruct{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student1, student2student1, student2;;

或或

无名结构体定义,无名结构体定义,变量只能一次 变量只能一次 无名结构体定义,无名结构体定义,变量只能一次 变量只能一次

Page 9: 第 9 章   结构体

几点说明:几点说明:(1) (1) 结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同

类型类型 : : 不分配内存;不分配内存; 变量变量 : : 分配内存分配内存 类型类型 : : 不能赋值、存取、运算不能赋值、存取、运算 ;; 变量变量 : : 可可以以

(2) (2) 结构体可以嵌套结构体可以嵌套

例:例: struct datestruct date{ { int month;int month; int day;int day; int year;int year;};};struct studentstruct student{{ int num;int num; char name[20];char name[20]; struct date birthdaystruct date birthday;;} stu;} stu;

例:例: struct datestruct date{ { int month;int month; int day;int day; int year;int year;};};struct studentstruct student{{ int num;int num; char name[20];char name[20]; struct date birthdaystruct date birthday;;} stu;} stu;

numnum namenamebirthdaybirthday

monthmonth dayday yearyear

例:例: struct studentstruct student{{ int num;int num; char name[20];char name[20]; struct datestruct date { { int month;int month; int day;int day; int year;int year; }} birthdaybirthday;;} stu;} stu;

例:例: struct studentstruct student{{ int num;int num; char name[20];char name[20]; struct datestruct date { { int month;int month; int day;int day; int year;int year; }} birthdaybirthday;;} stu;} stu;

numnum namenamebirthdaybirthday

monthmonth dayday yearyear

(3) (3) 结构类型中的成员名,可以与程序中的变量同名,它们结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰代表不同的对象,互不干扰

struct Student_Infostruct Student_Info stude student;nt;

char name[20];char name[20];

struct Student_Infostruct Student_Info stude student;nt;

char name[20];char name[20];

(4) (4) 结构体类型及变量的作用域和生存期与基本类型变量相结构体类型及变量的作用域和生存期与基本类型变量相同同

Page 10: 第 9 章   结构体

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

if (if (stu1 == stu2stu1 == stu2)) …… …….. (.. ())

if (if (stu1 == stu2stu1 == stu2)) …… …….. (.. ())

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu, *pstu = &stustu, *pstu = &stu; ;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu, *pstu = &stustu, *pstu = &stu; ;

strcpy (stu.name, "zhangMing");strcpy (stu.name, "zhangMing"); strcpy (stu.name, "zhangMing");strcpy (stu.name, "zhangMing");

stu.score = 80;stu.score = 80; stu.score = 80;stu.score = 80;

pstu->score += 10;pstu->score += 10; pstu->score += 10;pstu->score += 10;

printf ("%s %f", stu.name, (*pstu).score);printf ("%s %f", stu.name, (*pstu).score);

printf ("%s %f", stu.name, (*pstu).score);printf ("%s %f", stu.name, (*pstu).score);

结构体变量的引用结构体变量的引用 引用规则引用规则

结构体变量结构体变量不能整体引用不能整体引用 ,, 只能引用变量只能引用变量成员成员引用方式:引用方式:

结构体变量名结构体变量名 .. 成员名 成员名 //// 非指针型结构体变量的引用非指针型结构体变量的引用结构体变量名结构体变量名 .. 成员名 成员名 //// 非指针型结构体变量的引用非指针型结构体变量的引用

可以将一个可以将一个结构体变量赋值给另一个结构体变量结构体变量赋值给另一个结构体变量结构体嵌套时结构体嵌套时逐级引用逐级引用

结构体指针结构体指针 ->-> 成员名 成员名 或或 ( ( ** 结构体指针)结构体指针) .. 成员名成员名//// 指针型结构体变量的引用指针型结构体变量的引用

结构体指针结构体指针 ->-> 成员名 成员名 或或 ( ( ** 结构体指针)结构体指针) .. 成员名成员名//// 指针型结构体变量的引用指针型结构体变量的引用

成员成员 (( 分量分量 )) 运算符运算符结合性结合性 :: 从左向右从左向右成员成员 (( 分量分量 )) 运算符运算符结合性结合性 :: 从左向右从左向右成员成员 (( 分量分量 )) 运算符运算符结合性结合性 :: 从左向右从左向右成员成员 (( 分量分量 )) 运算符运算符结合性结合性 :: 从左向右从左向右

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2;;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2;;

stu1.num = 10;stu1.num = 10;stu1.num = 10;stu1.num = 10;

stu1.score = 85.5;stu1.score = 85.5;stu1.score = 85.5;stu1.score = 85.5;

stu1.score += stu2.score;stu1.score += stu2.score; stu1.age++;stu1.age++;

stu1.score += stu2.score;stu1.score += stu2.score; stu1.age++;stu1.age++;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

printf(“%d,%s,%c,%d,%f,%s\n”,printf(“%d,%s,%c,%d,%f,%s\n”,stu1stu1); (); ())printf(“%d,%s,%c,%d,%f,%s\n”,printf(“%d,%s,%c,%d,%f,%s\n”,stu1stu1); (); ())

stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; (stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; ())stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; (stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; ())

结构体变量名结构体变量名 .. 成员名成员名 .. 子成员名……最低级子成员名子成员名……最低级子成员名结构体变量名结构体变量名 .. 成员名成员名 .. 子成员名……最低级子成员名子成员名……最低级子成员名

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

例 例 struct studentstruct student { { int num;int num; char name[20];char name[20]; char sex;char sex; int age;int age; float score;float score; char addr[30];char addr[30]; } } stu1, stu2stu1, stu2; ;

Stu2 = stu1; (Stu2 = stu1; (√√))Stu2 = stu1; (Stu2 = stu1; (√√))

例例 struct studentstruct student { { int num;int num; char name[20];char name[20]; struct date struct date { { int month;int month; int day;int day; int year;int year; }} birthdaybirthday;; } } stu1, stu2, *pstu = &stu1stu1, stu2, *pstu = &stu1;;

例例 struct studentstruct student { { int num;int num; char name[20];char name[20]; struct date struct date { { int month;int month; int day;int day; int year;int year; }} birthdaybirthday;; } } stu1, stu2, *pstu = &stu1stu1, stu2, *pstu = &stu1;;

numnum namenamebirthdaybirthday

monthmonth dayday yearyear

stu1.birthday.month = 12;stu1.birthday.month = 12;stu1.birthday.month = 12;stu1.birthday.month = 12;

pstu1->birthday.year = 2008;pstu1->birthday.year = 2008;pstu1->birthday.year = 2008;pstu1->birthday.year = 2008;

注意:在利用指针引用结构体成员时,注意:在利用指针引用结构体成员时, -- 和和 >> 之间不能有空格。之间不能有空格。注意:在利用指针引用结构体成员时,注意:在利用指针引用结构体成员时, -- 和和 >> 之间不能有空格。之间不能有空格。

Page 11: 第 9 章   结构体

33 、结构体变量的赋值、结构体变量的赋值 结构体变量初始化赋值结构体变量初始化赋值

先定义结构体类型,再定义结构体变量时赋初值先定义结构体类型,再定义结构体变量时赋初值

structstruct 结构体类型名 结构体类型名 初值表初值表{ … … }{ … … } ;;struct struct 结构体类型名 变量名 结构体类型名 变量名 = {= { 成员成员 11 的值, …, 成员的值, …, 成员 nn的值的值 }} ;;

structstruct 结构体类型名 结构体类型名 初值表初值表{ … … }{ … … } ;;struct struct 结构体类型名 变量名 结构体类型名 变量名 = {= { 成员成员 11 的值, …, 成员的值, …, 成员 nn的值的值 }} ;; 注意:注意:赋初值时,赋初值时, { }{ } 中间的数据顺序必须与结构中间的数据顺序必须与结构

体成员的定义顺序一致,否则就会出现混乱。体成员的定义顺序一致,否则就会出现混乱。

struct Student_Infostruct Student_Info stu = {"20020306", "ZhangMing", 'M', 18, 1, 90}; stu = {"20020306", "ZhangMing", 'M', 18, 1, 90}; struct Student_Infostruct Student_Info stu = {"20020306", "ZhangMing", 'M', 18, 1, 90}; stu = {"20020306", "ZhangMing", 'M', 18, 1, 90};

nono namename sexsex ageage classnoclassno gradegrade

√√

struct Student_Infostruct Student_Info stu = {18, "ZhangMing", 'M', "20020306", 1, 90}; stu = {18, "ZhangMing", 'M', "20020306", 1, 90}; struct Student_Infostruct Student_Info stu = {18, "ZhangMing", 'M', "20020306", 1, 90}; stu = {18, "ZhangMing", 'M', "20020306", 1, 90}; ××

Page 12: 第 9 章   结构体

33 、结构体变量的赋值、结构体变量的赋值 结构体变量初始化赋值结构体变量初始化赋值

定义结构体类型的同时,定义结构体变量并赋初值定义结构体类型的同时,定义结构体变量并赋初值

struct struct [ [ 结构体类型名结构体类型名 ]]{ { 初值表初值表 … … … … } } 变量名 变量名 = {= { 成员成员 11 的值,成员的值,成员 22 的值, …, 成员的值, …, 成员 nn 的的值值 }} ;;

struct struct [ [ 结构体类型名结构体类型名 ]]{ { 初值表初值表 … … … … } } 变量名 变量名 = {= { 成员成员 11 的值,成员的值,成员 22 的值, …, 成员的值, …, 成员 nn 的的值值 }} ;;

struct Datestruct Date {{ int year, month, day;int year, month, day;} } birthday = {1986, 12, 10};birthday = {1986, 12, 10};

struct Datestruct Date {{ int year, month, day;int year, month, day;} } birthday = {1986, 12, 10};birthday = {1986, 12, 10};

struct struct {{ int year, month, day;int year, month, day;} } birthday = {1986, 12, 10};birthday = {1986, 12, 10};

struct struct {{ int year, month, day;int year, month, day;} } birthday = {1986, 12, 10};birthday = {1986, 12, 10};

或或struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student = student = {"20020306", "ZhangMing", 'M', 18, 1, 90};{"20020306", "ZhangMing", 'M', 18, 1, 90};

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; //// 学号学号 char name[20]; char name[20]; //// 姓名姓名 char sex; char sex; //// 性别性别 unsigned int age; unsigned int age; //// 年龄年龄 unsigned int classno; unsigned int classno; //// 班级班级 float grade; float grade; //// 成绩成绩} } student = student = {"20020306", "ZhangMing", 'M', 18, 1, 90};{"20020306", "ZhangMing", 'M', 18, 1, 90};

Page 13: 第 9 章   结构体

strcpy (stu1.no, stu.no); strcpy (stu1.no, stu.no); strcpy (stu1.name, stu.name);strcpy (stu1.name, stu.name);stu1.sex = stu.sex;stu1.sex = stu.sex;stu1.age = stu.age;stu1.age = stu.age;stu1.classno = stu.classno;stu1.classno = stu.classno;stu1.grade = stu.gradestu1.grade = stu.grade;

strcpy (stu1.no, stu.no); strcpy (stu1.no, stu.no); strcpy (stu1.name, stu.name);strcpy (stu1.name, stu.name);stu1.sex = stu.sex;stu1.sex = stu.sex;stu1.age = stu.age;stu1.age = stu.age;stu1.classno = stu.classno;stu1.classno = stu.classno;stu1.grade = stu.gradestu1.grade = stu.grade;

struct Student_Info stu;struct Student_Info stu;

strcpy (stu.no, "20020306"); strcpy (stu.no, "20020306"); strcpy (stu.name, "ZhangMing");strcpy (stu.name, "ZhangMing");stu.sex = 'M';stu.sex = 'M';stu.age = 18;stu.age = 18;stu.classno = 1;stu.classno = 1;stu.grade = 90;stu.grade = 90;

struct Student_Info stu1;struct Student_Info stu1;stu1 = stu;stu1 = stu;

struct Student_Info stu;struct Student_Info stu;

strcpy (stu.no, "20020306"); strcpy (stu.no, "20020306"); strcpy (stu.name, "ZhangMing");strcpy (stu.name, "ZhangMing");stu.sex = 'M';stu.sex = 'M';stu.age = 18;stu.age = 18;stu.classno = 1;stu.classno = 1;stu.grade = 90;stu.grade = 90;

struct Student_Info stu1;struct Student_Info stu1;stu1 = stu;stu1 = stu;

33 、结构体变量的赋值、结构体变量的赋值 结构体变量在程序中赋值结构体变量在程序中赋值

如果在定义结构体变量时并未对其赋初始值,那么在程如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员序中要对它赋值的话,就只能一个一个地对其成员逐一赋值逐一赋值,,或者或者用已赋值的同类型的结构体变量对它赋值用已赋值的同类型的结构体变量对它赋值

逐一赋值 逐一赋值 逐一赋值 逐一赋值

利用已赋值的结利用已赋值的结构体变量赋值 构体变量赋值 利用已赋值的结利用已赋值的结构体变量赋值 构体变量赋值

Page 14: 第 9 章   结构体

【例】 计算学生【例】 计算学生 55 门课的平均成绩,最高分和最低分。门课的平均成绩,最高分和最低分。

#include <stdio.h>#include <stdio.h>

struct scorestruct score{{ float grade[5];float grade[5]; float avegrade, maxgrade, mingrade;float avegrade, maxgrade, mingrade;};};

void main ( )void main ( ){{ int i;int i; struct score m;struct score m; printf ("input the grade of five course:\n");printf ("input the grade of five course:\n"); for (i = 0; i < 5; i++) for (i = 0; i < 5; i++) //// 输入输入 55 门课的成绩门课的成绩 scanf ("%f", &m.grade[i]);scanf ("%f", &m.grade[i]);

#include <stdio.h>#include <stdio.h>

struct scorestruct score{{ float grade[5];float grade[5]; float avegrade, maxgrade, mingrade;float avegrade, maxgrade, mingrade;};};

void main ( )void main ( ){{ int i;int i; struct score m;struct score m; printf ("input the grade of five course:\n");printf ("input the grade of five course:\n"); for (i = 0; i < 5; i++) for (i = 0; i < 5; i++) //// 输入输入 55 门课的成绩门课的成绩 scanf ("%f", &m.grade[i]);scanf ("%f", &m.grade[i]);

m.avegrade = 0;m.avegrade = 0; m.maxgrade = m.grade[0];m.maxgrade = m.grade[0]; m.mingrade = m.grade[0];m.mingrade = m.grade[0]; for (i = 0; i < 5; i++) for (i = 0; i < 5; i++) //// 求平均分、最高分、最低分求平均分、最高分、最低分 {{ m.avegrade += m.grade[i];m.avegrade += m.grade[i]; m.maxgrade = (m.grade[i] > m.maxgrade) ? m.maxgrade = (m.grade[i] > m.maxgrade) ? m.grade[i] : m.maxgrade;m.grade[i] : m.maxgrade; m.mingrade = (m.grade[i] < m.mingrade) ? m.mingrade = (m.grade[i] < m.mingrade) ? m.grade[i] : m.mingrade;m.grade[i] : m.mingrade; }} m.avegrade /= 5;m.avegrade /= 5; printf ("avegrade = %5.1f maxgrade = %5.1f printf ("avegrade = %5.1f maxgrade = %5.1f mingrade = %5.1f\n",mingrade = %5.1f\n", m.avegrade, m.maxgrade, m.mingrade);m.avegrade, m.maxgrade, m.mingrade);}}

m.avegrade = 0;m.avegrade = 0; m.maxgrade = m.grade[0];m.maxgrade = m.grade[0]; m.mingrade = m.grade[0];m.mingrade = m.grade[0]; for (i = 0; i < 5; i++) for (i = 0; i < 5; i++) //// 求平均分、最高分、最低分求平均分、最高分、最低分 {{ m.avegrade += m.grade[i];m.avegrade += m.grade[i]; m.maxgrade = (m.grade[i] > m.maxgrade) ? m.maxgrade = (m.grade[i] > m.maxgrade) ? m.grade[i] : m.maxgrade;m.grade[i] : m.maxgrade; m.mingrade = (m.grade[i] < m.mingrade) ? m.mingrade = (m.grade[i] < m.mingrade) ? m.grade[i] : m.mingrade;m.grade[i] : m.mingrade; }} m.avegrade /= 5;m.avegrade /= 5; printf ("avegrade = %5.1f maxgrade = %5.1f printf ("avegrade = %5.1f maxgrade = %5.1f mingrade = %5.1f\n",mingrade = %5.1f\n", m.avegrade, m.maxgrade, m.mingrade);m.avegrade, m.maxgrade, m.mingrade);}}

运行结果运行结果 (( 设设 55 门课的成绩为:门课的成绩为: 75 80 86 90 68 )75 80 86 90 68 ) ::avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0

运行结果运行结果 (( 设设 55 门课的成绩为:门课的成绩为: 75 80 86 90 68 )75 80 86 90 68 ) ::avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0

Page 15: 第 9 章   结构体

55 、结构体数组、结构体数组 结构体数组的每一个元素都是具有相同结构体类型的下标结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。 结构变量。

结构体数组的定义结构体数组的定义三种形式:三种形式:

ageage

nononamename

sexsex

classnoclassnogradegrade

ageage

nononamename

sexsex

classnoclassnogradegrade

……stu[0]stu[0]

stu[9]stu[9]

…………

形式一:形式一:struct Student_Infostruct Student_Info{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} ;} ;struct Student_Info stu[10];struct Student_Info stu[10];

形式一:形式一:struct Student_Infostruct Student_Info{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} ;} ;struct Student_Info stu[10];struct Student_Info stu[10];

形式二:形式二:struct Student_Infostruct Student_Info{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} } stu[10];stu[10];

形式二:形式二:struct Student_Infostruct Student_Info{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} } stu[10];stu[10];

形式三:形式三:structstruct{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} } stu[10];stu[10];

形式三:形式三:structstruct{{ char no[9], name[20], sex; char no[9], name[20], sex; unsigned int age, classno; unsigned int age, classno; float grade;float grade;} } stu[10];stu[10];

Page 16: 第 9 章   结构体

结构体数组的初始化结构体数组的初始化初始化的格式为初始化的格式为 : :

structstruct 结构体类型名结构体类型名{ … … }{ … … } ;;struct struct 结构体类型名 结构体数组结构体类型名 结构体数组 [size] = {{[size] = {{ 初值表初值表 1}1} , …, , …, {{ 初值表初值表n}}n}} ;;

structstruct 结构体类型名结构体类型名{ … … }{ … … } ;;struct struct 结构体类型名 结构体数组结构体类型名 结构体数组 [size] = {{[size] = {{ 初值表初值表 1}1} , …, , …, {{ 初值表初值表n}}n}} ;;

struct struct [ [ 结构体类型名结构体类型名 ]]{{… … … … } } 结构体数组结构体数组 [size] = {{[size] = {{ 初值表初值表 1}1} ,, {{ 初值表初值表 2}2} , …, , …, {{ 初值表初值表 n}}n}} ;;

struct struct [ [ 结构体类型名结构体类型名 ]]{{… … … … } } 结构体数组结构体数组 [size] = {{[size] = {{ 初值表初值表 1}1} ,, {{ 初值表初值表 2}2} , …, , …, {{ 初值表初值表 n}}n}} ;;

或或

struct Student_Info stu[3] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, struct Student_Info stu[3] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, {"20020307", "WangHai", 'M', 17, 1, 85},{"20020307", "WangHai", 'M', 17, 1, 85}, {"20020308", "LiHong", 'F', 18, 2, 95}};{"20020308", "LiHong", 'F', 18, 2, 95}};

struct Student_Info stu[3] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, struct Student_Info stu[3] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, {"20020307", "WangHai", 'M', 17, 1, 85},{"20020307", "WangHai", 'M', 17, 1, 85}, {"20020308", "LiHong", 'F', 18, 2, 95}};{"20020308", "LiHong", 'F', 18, 2, 95}};

例:例:

分行初始化分行初始化分行初始化分行初始化

struct Student_Info stu[ ] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, struct Student_Info stu[ ] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, {"20020307", "WangHai", 'M', 17, 1, 85},{"20020307", "WangHai", 'M', 17, 1, 85}, {"20020308", "LiHong", 'F', 18, 2, 95}};{"20020308", "LiHong", 'F', 18, 2, 95}};

struct Student_Info stu[ ] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, struct Student_Info stu[ ] = {{"20020306", "ZhangMing", 'M', 18, 1, 90}, {"20020307", "WangHai", 'M', 17, 1, 85},{"20020307", "WangHai", 'M', 17, 1, 85}, {"20020308", "LiHong", 'F', 18, 2, 95}};{"20020308", "LiHong", 'F', 18, 2, 95}};

例:例:

分行初始化分行初始化分行初始化分行初始化

全部初始化时维数可省全部初始化时维数可省全部初始化时维数可省全部初始化时维数可省

struct Student_Info stu[3] = { "20020306", "ZhangMing", 'M', 18, 1, 90, struct Student_Info stu[3] = { "20020306", "ZhangMing", 'M', 18, 1, 90, "20020307", "WangHai", 'M', 17, 1, 85,"20020307", "WangHai", 'M', 17, 1, 85, "20020308", "LiHong", 'F', 18, 2, 95 };"20020308", "LiHong", 'F', 18, 2, 95 };

struct Student_Info stu[3] = { "20020306", "ZhangMing", 'M', 18, 1, 90, struct Student_Info stu[3] = { "20020306", "ZhangMing", 'M', 18, 1, 90, "20020307", "WangHai", 'M', 17, 1, 85,"20020307", "WangHai", 'M', 17, 1, 85, "20020308", "LiHong", 'F', 18, 2, 95 };"20020308", "LiHong", 'F', 18, 2, 95 };

例:例:

顺序初始化顺序初始化顺序初始化顺序初始化

Page 17: 第 9 章   结构体

结构体数组的引用结构体数组的引用引用格式为引用格式为 : :

结构体数组名结构体数组名 [[ 下标下标 ].]. 成员名;成员名;结构体数组名结构体数组名 [[ 下标下标 ].]. 成员名;成员名;

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; char name[20];char name[20]; char sex; char sex; unsigned int age;unsigned int age; unsigned int classno; unsigned int classno; float grade;float grade;} } stu[10];stu[10];

struct Student_Infostruct Student_Info{{ char no[9]; char no[9]; char name[20];char name[20]; char sex; char sex; unsigned int age;unsigned int age; unsigned int classno; unsigned int classno; float grade;float grade;} } stu[10];stu[10];

strcpy (stu[0].name, "WangFei");strcpy (stu[0].name, "WangFei"); strcpy (stu[0].name, "WangFei");strcpy (stu[0].name, "WangFei");

stu[1].grade++; stu[1].grade++; stu[1].grade++; stu[1].grade++;

printf ("%s", stu[0].name);printf ("%s", stu[0].name);printf ("%s", stu[0].name);printf ("%s", stu[0].name);

Page 18: 第 9 章   结构体

【例】统计侯选人选票。【例】统计侯选人选票。

#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>

struct personstruct person{ { char name[20]; char name[20]; ////候选人姓名候选人姓名 int count; int count; ////得票数得票数} leader[3] = { "Li", 0, } leader[3] = { "Li", 0, "Zhang", 0, "Zhang", 0, "Wang", 0 };"Wang", 0 };

#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>

struct personstruct person{ { char name[20]; char name[20]; ////候选人姓名候选人姓名 int count; int count; ////得票数得票数} leader[3] = { "Li", 0, } leader[3] = { "Li", 0, "Zhang", 0, "Zhang", 0, "Wang", 0 };"Wang", 0 };

void main ( )void main ( ){ { int i, j; int i, j; char leader_name[20];char leader_name[20]; while (1) while (1) ////统计候选人得票数统计候选人得票数 { { scanf ("%s", leader_name); scanf ("%s", leader_name); //// 输入候选人姓名输入候选人姓名 if (strcmp(leader_name, "0") == 0) if (strcmp(leader_name, "0") == 0) //// 输入为输入为 "0""0" 结束结束 break;break; for (j = 0; j < 3; j++) for (j = 0; j < 3; j++) ////比较是否为合法候选人比较是否为合法候选人 if (strcmp(leader_name,leader[j].name) == 0) if (strcmp(leader_name,leader[j].name) == 0) //// 合法合法 leader[j].count++; leader[j].count++; ////得票数加得票数加 11

}}

for (i = 0; i < 3; i++) for (i = 0; i < 3; i++) ////显示后选人得票数显示后选人得票数 printf ("%5s : %d\n", leader[i].name, leader[i].count);printf ("%5s : %d\n", leader[i].name, leader[i].count);}}

void main ( )void main ( ){ { int i, j; int i, j; char leader_name[20];char leader_name[20]; while (1) while (1) ////统计候选人得票数统计候选人得票数 { { scanf ("%s", leader_name); scanf ("%s", leader_name); //// 输入候选人姓名输入候选人姓名 if (strcmp(leader_name, "0") == 0) if (strcmp(leader_name, "0") == 0) //// 输入为输入为 "0""0" 结束结束 break;break; for (j = 0; j < 3; j++) for (j = 0; j < 3; j++) ////比较是否为合法候选人比较是否为合法候选人 if (strcmp(leader_name,leader[j].name) == 0) if (strcmp(leader_name,leader[j].name) == 0) //// 合法合法 leader[j].count++; leader[j].count++; ////得票数加得票数加 11

}}

for (i = 0; i < 3; i++) for (i = 0; i < 3; i++) ////显示后选人得票数显示后选人得票数 printf ("%5s : %d\n", leader[i].name, leader[i].count);printf ("%5s : %d\n", leader[i].name, leader[i].count);}}

Page 19: 第 9 章   结构体

【例】假设某结构体【例】假设某结构体 AA,, AA包括学号、语文、数据、英语包括学号、语文、数据、英语成员,编写一结构体数组,数组长度为成员,编写一结构体数组,数组长度为 1010,并将数组按语数英,并将数组按语数英三科总成绩从高到低排序,然后打印出来。三科总成绩从高到低排序,然后打印出来。注意:结构体中的数据用随机函数生成。注意:结构体中的数据用随机函数生成。