190 likes | 315 Views
第十一章 结构体与共用体. 主要内容. 一、声明结构体类型的方法 二、定义结构体类型变量的方法 三、结构体变量的引用 四、结构体变量的初始化 五、结构体数组 六、用 typedef 定义类型. (一)什么是结构体 (二)结构体类型的声明. 一、声明结构体类型的方法. (一)什么是结构体. 结构体是一种构造类型(自定义类型) , 除了结构体变量需要定义后才能使用外,结构体的类型本身也需要声明。结构体由若干 “ 成员 ” 组成。每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。. struct 结构体名 { 类型 1 成员 1 ;
E N D
主要内容 一、声明结构体类型的方法 二、定义结构体类型变量的方法 三、结构体变量的引用 四、结构体变量的初始化 五、结构体数组 六、用typedef定义类型
(一)什么是结构体 (二)结构体类型的声明 一、声明结构体类型的方法
(一)什么是结构体 结构体是一种构造类型(自定义类型),除了结构体变量需要定义后才能使用外,结构体的类型本身也需要声明。结构体由若干“成员”组成。每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。
struct 结构体名 { 类型1 成员1; 类型2 成员2; …… 类型3 成员3; }; (二)结构体类型的声明 说明: 1、结构体名:结构体类型的名称。遵循标识符规定。 2、结构体有若干数据成员,分别属于各自的数据类型,结构体成员名同样遵循标识符规定,它属于特定的结构体变量(对象),名字可以与程序中其它变量或标识符同名。 3、使用结构体类型时,struct 结构体名作为一个整体,表示名字为“结构体名”的结构体类型。 4、结构体类型的成员可以是基本数据类型,也可以是其它的已经定义的结构体类型-结构体嵌套。结构体成员的类型不能是正在定义的结构体类型,但可以是正在定义的结构体类型的指针。 分号不可少!!!
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; 结构体类型声明举例 声明一个包含如下学生信息的结构体类型 num name sex age score addr 说明: 1、struct student是结构体类型名,struct是关键字,在声明和使用时均不能省略。 2、该结构体类型由6个成员组成,分别属于不同的数据类型,分号“;”不能省略。 3、在声明了结构体类型后,可以定义结构体变量。
(一) 先声明结构体类型,再定义变量名 (二) 在声明结构体类型的同时定义变量 (三) 直接定义结构体类型变量 二、定义结构体类型变量的方法
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student student1,student2; (一) 先声明结构体类型,再定义变量名 struct结构体类型名 结构体变量名; 格式 前提:结构体类型 struct结构体类型名 已经被声明 举例
(二) 在声明结构体类型的同时定义变量 举例 格式 struct 结构体类型名 { 成员列表; }结构体变量名表; struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2; 在这里定义属于结构体类型的变量
(三) 直接定义结构体类型变量 举例 格式 不出现结构体名 struct { 成员列表; }结构体变量名表; struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2; 只在这里定义属于结构体类型的变量
student1.num=10010; scanf(“%s”,student1.name); student1.age++; 三、结构体变量的引用 “.”运算符是成员运算符。 格式 结构体变量名.成员名 举例 1、成员本身又是结构体类型时,子成员的访问使用成员运算符逐级访问; 例:student1.birthday.month 2、同一种类型的结构体变量之间可以直接赋值(整体赋值,成员逐个依次赋值); 例:student2=student1; 3、不允许将一个结构体变量整体输入/输出。 说明 scanf(“%d,%s,%c,%d,%f,%s”,&student1); printf(“%d,%s,%c,%d,%f,%s”,student1);
结构体变量也可以在定义时进行初始化,但是变量后面的一组数据应该用“{}”括起来,其顺序也应该与结构体中的成员顺序保持一致。结构体变量也可以在定义时进行初始化,但是变量后面的一组数据应该用“{}”括起来,其顺序也应该与结构体中的成员顺序保持一致。 四、结构体变量的初始化 #include <stdio.h> void main() { struct student{ long int num; char name[20]; char sex; char addr[20]; }a={89031,”Li Lin”,’M’,”123 Beijing Road”}; printf(“No.:%ld\nName:%s\nSex:%c\nAddr:%s”, a.num, a.name, a.sex, a.addr); } No.:89031 Name:Li Lin Sex:M Addr:123 Beijing Road 举例
五、结构体数组 概念 结构体数组指数组元素的类型为结构体类型的数组。 与定义结构体变量一样,有如下三种方法: 1、先声明结构体类型,再定义结构体数组 2、在声明结构体类型的同时定义结构体数组 3、直接定义结构体数组 定义 struct student{ long int num; char name[20]; char sex; char addr[20]; } stu[30]; struct { long int num; char name[20]; char sex; char addr[20]; } stu[30]; struct student{ long int num; char name[20]; char sex; char addr[20]; }; struct student stu[30];
初始化 与普通数组一样,结构体数组也可在定义时进行初始化。在对结构体数组初始化时,要将每个元素的数据用“{}”括起来。 初始化格式 结构体数组[n]={{初值表1},{初值表2},...,{初值表n}} 由于定义结构体数组有三种方法,因此对应的初始化形式也有三种。 举例 初始化结构体变量时,可以不指定结构体数组元素的个数,系统根据初始化列表来决定元素个数。 struct student{ long int num; char name[20]; char sex; char addr[20]; }stu[3]={{100,”Li”,’M’,”Beijing”}, {101,”Zhao”,’M’,”Hebei”}, {102,”Wang”,’M’,”Shanghai”}};
输入三个学生的信息(学号、姓名和成绩): • 张三 85 • 李四80 • 王五76 • No. Name Score • 张三 85 • 李四 80 • 104 王五 76 定义一个结构体类型struct student,包含学生的学号、姓名和成绩三项基本信息。分别读入3个学生的信息并按照表格形式显示输出。 举例 #include"stdio.h" struct student { char num[10]; char name[10]; int score; }stu[3]; void main() { int i; printf(“输入三个学生的信息(学号、姓名和成绩):\n”); for(i=0; i<3; i++) scanf("%s%s%d",stu[i].num,stu[i].name,&stu[i].score); printf("No.\tName\tScore\n"); for(i=0; i<3; i++) printf("%s\t%s\t%d\n", stu[i].num,stu[i].name,stu[i].score); }
六、用typedef定义类型 除可直接使用C提供的标准类型和自定义的类型(如结构体类型)外,也可使用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。 格式 typedef 类型定义 类型名; 可以是标准类型, 也可以是自定义类型。 typedef struct { int month; int day; int year; }DATE; DATE birthday; typedef int INTEGER; typedef float REAL; INTEGER i,j; REAL a,b; 举例
举例 typedef int NUM[100]; /* 定义NUM是含有100个数的整型数组类型*/ NUM n; /* 定义NUM类型(100个数的整型数组)的变量n */ typedef char* STRING; /* 定义STRING是字符指针类型 */ STRING p; /* 定义STRING类型(字符指针类型)的变量p */
说明 1、typedef是定义了一个新的类型的名字,没有建立新的数据类型,它是已有类型的别名。使用类型定义,可以增加程序的可读性,简化书写。 • 2、typedef与#define有相似之处, 如: • typedef int COUNT; • 和 #define COUNT int • 的作用都是COUNT代表int。 • 但二者是不同的:#define是在预编译时处理的,只能作简单的字符串替换;typedef是在编译时处理的,不是简单的字符串替换,如typedef int NUM[10];不是用“NUM[10]”去代替“int”,而是一种类型的声明。
作 业 P296: 11.1, 11.2, 11.3