第10章 结构体与共用体 概述 结构体 共用体 枚举类型.

Slides:



Advertisements
Similar presentations
目 录  第 1 章 C++ 概述  第 2 章 数据类型、运算符和表达式  第 3 章 简单的输入 / 输出  第 4 章 C++ 的流程控制  第 5 章 函数  第 6 章 编译预处理  第 7 章 数组  第 8 章 结构体、共同体和枚举类型  第 9 章 指针和引用  第.
Advertisements

第9章 用户建立的数据类型 公共计算机基础教研部.
程序设计导论 ——第15讲 结构与结构数组.
程序设计导论 结构与结构数组.
电子成绩单项目实现.
第10章 结构体与链表 本章要点: 结构体类型与结构体变量的定义 结构体变量的引用与初始化 结构体数组 链表处理 共用体类型和枚举类型
二级指针与二维数组.
大学实用教程 C语言.
第14章 c++中的代码重用.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
第九章 结构体 主讲教师 :贾月乐 电话:
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
7.1 结构体类型 7.2 共用体 7.3 枚举类型 7.4 用typedef声明类型
第9章 结构体.
SISO 2011级 C语言复习指导 灰色部分不需要复习 1.
结构体和共用体 2 梁春燕 华电信息管理教研室.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第9章 用户自己建立数据类型 9.1 定义和使用结构体变量 9.2 使用结构体数组 9.3 结构体指针 9.4 用指针处理链表
程序设计专题 第2讲 - 结构 刘新国.
STRUCTURE 授課:ANT 日期:2010/5/12.
自定义数据类型 潘荣江 山东大学计算机科学与技术学院
程序设计基础.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
C语言程序设计 李祥.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
管理信息结构SMI.
辅导课程六.
第五章 指针 5.1 指针的概念和定义 5.2 指针运算 5.3 指针和数组 5.4 字符串指针 5.5 指针数组 5.6 指向指针的指针
第7讲 结构体与共用体 7.1 结构体 7.2 共用体.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第8章 结 构 体.
第11章 结构体和共用体.
第七章 结构体、共同体和枚举类型.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
第五章 习题课 电子信息与计算机科学系 曾庆尚.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言复习3----结构体.
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
第十章 结构体与链表 西安工程大学.
第9章 用户自己建立数据类型 C语言提供了一些系统已定义好的数据类型,如int,float,char,用户可以用它们定义变量。
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
C++大学基础教程 第7章 其它自定义数据类型 北京科技大学 信息基础科学系.
第九章 用户建立的数据类型.
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
第三章 数据抽象.
第4章 Excel电子表格制作软件 4.4 函数(一).
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九节 赋值运算符和赋值表达式.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
本节内容 指针类型.
结构体与共用体 结构体 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体 自定义数据类型 结构体类型定义
本节内容 结构体.
C语言程序设计 第9章 结构体.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
第14讲 结构体和共用体 计算机与通信工程学院.
第八章 结构体和共用体 结构体类型和结构体变量 结构体数组 结构体指针变量 共用体.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
安排座位.
Presentation transcript:

第10章 结构体与共用体 概述 结构体 共用体 枚举类型

“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。 结构简介 问题: 存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩) 解决方案: I. 使用数组 II. 使用多维数组 不能建立数组间的关系 01 02 03 04 05 num III. 使用结构 C 语言不允许一个数组包含多种数据类型 Mary John Peter Rose Kate F M 01 02 03 04 05 89 78.5 67 97.5 64 C 语言引入了称为结构的数据存储方式 Mary John Peter Rose Kate name num name sex score F M sex score 89 78.5 67 97.5 64 “结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。

§10.1 概述 结构体(structure)是用户自定义的一种数据类型,包含若干个类型不同的数据项。 §10.1 概述 结构体(structure)是用户自定义的一种数据类型,包含若干个类型不同的数据项。 用途:把不同类型的数据组合成一个整体。而分别用独立变量来表示不能反映它们之间的内在联系。 例:定义一个结构体类型student,包含学号、姓名、性别、年龄、成绩、家庭地址。

§10.1 概述 结构体类型的定义 struct 结构体名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; 合法标识符 可省略:无名结构体 结构体类型的定义 struct 结构体名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; struct是关键字,不能省略 成员类型可以是基本类型或构造类型 必须有分号

定义结构 struct structurename { datatype variable1; datatype variable2; 结构名 struct structurename { datatype variable1; datatype variable2; ... }; 结构成员 C 语言中的有效数据类型 struct student { int num; char name[20]; char sex; float score; };

定义结构 struct student { int num; char name[20]; char sex; float score; }; student num name sex score 结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。

可以改写成int year,mongth,day; 日期结构体类型:由年、月、日三项组成 struct date { int year; int month; int day; }; 可以改写成int year,mongth,day; struct std_info { int num ; char name[20]; char sex; float score; char addr[30]; struct date birthday; }; 学生信息结构类型:由学号、姓名、性别、成绩、地址和生日共6项组成

§10.1.1结构体变量的定义 间接定义法: 直接定义法: 先定义结构体类型,后定义结构体变量 在定义结构类型的同时,定义结构变量 结构体类型名student可以不写 struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2; struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;

num name sex age score addr struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2; num name sex age score addr stu1: 2 20 1 2 4 30 stu1在内存中共占字节数: 2+20+1+2+4+30=59

 §10.1.3 结构体变量的引用 结构体变量的引用原则 结构体变量不能整体输入输出,要通过成员运算符“.”,逐个访问其成员,且访问的格式为: 结构体变量.成员 “.”是成员运算符,优先级最高 struct date { int year; int month; int day; }; struct date birth;  printf("%d,%d,%d",birth); printf("%d,%d,%d",birth.year, birth.month,birth.day); 

结构体变量的引用原则 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 struct date { int year; int month; int day; }; 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 结构变量.成员.子成员.….最低级子成员 struct std_info { int num ; char name[20]; char sex; float score; struct date birthday; }student; 引用结构变量student中的birthday成员的格式分别为: student.birthday.year student.birthday.month student.birthday.day num name sex score birthday 对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 student:

结构体变量的初始化 结构体类型名 结构体变量={初值表}; 一般形式 说明 结构体类型名 结构体变量={初值表}; 说明 若某成员本身又是结构体类型,则该成员的初值为一个初值表 初值的数据类型,应与结构变量中相应成员的类型一致 struct std_info { int num ; char name[20]; char sex; float score; struct date birthday; }; struct std_info student={102, "Zhangsan", 'M', 85, {1980,9,20}} ;

结构变量初始化 student1 struct student { int num; char name[20]; char sex; float score; }; struct student student1,student2; 结构变量初始化 赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。 struct student student1={1,"Yao Ming ",'M',90.5}; 内存 student1 1 Yao Ming M 90.5 student1.name student1.num student1.score student1.sex

结构变量赋值 用输入语句或赋值语句来给结构变量的各个成员赋值 78 student3 = student2; student2 1 student2.num=1; student2.name="Zhang Zi Liang"; student2.sex=’M’; printf("请输入成绩:\n"); scanf("%f",&student2.score); 78 student3 = student2; student2 1 Zhang Zi Liang M 78 student3 1 Zhang Zi Liang M 78

使用结构示例 stu1 李亚鹏 1 M 78 stu2 周晶晶 2 F 92 问题描述: 根据学员的成绩,输出不及格学员的详细信息。 #include<stdio.h> struct student { int num;//学号 char *name;//姓名 char sex;//性别 float score;//成绩 }; void main() static struct student stu1={1,"李亚鹏",'M',61}; static struct student stu2={2,"周晶晶",'F',92.5}; static struct student stu3={3,"姚光明",'M',59}; printf("不及格学员的名单如下:\n"); if(stu1.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu1.num,stu1.name,stu1.sex,stu1.score); if(stu2.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu2.num,stu2.name,stu2.sex,stu2.score); if(stu3.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu3.num,stu3.name,stu3.sex,stu3.score); if(stu1.score>=60 && stu2.score>=60 && stu3.score>=60) printf("没有不及格的学员。\n"); } 使用结构示例 stu1 李亚鹏 1 M 78 stu2 周晶晶 2 F 92 问题描述: 根据学员的成绩,输出不及格学员的详细信息。 stu3 姚光明 3 M 59 不及格学员的名单如下: 3 姚光明 M 59.00

[例] 定义一个结构变量stu,用于存储和显示一个学生的基本 情况。 struct std_info {int num ; char name[20]; char sex; struct date birthday; }; main() { struct std_info stu={102, "Zhangsan", 'M', {1980,9,20}} ; printf("Num: %d\n",stu.num); printf("Name: %s\n",stu.name); printf("Sex: %c\n",stu.sex); printf("Birthday: %d-%d-%d\n",stu.birthday.year, stu.birthday.month, stu.birthday.day); } struct std_info stu; scanf("%d%s %c%d%d%d", &stu.num,stu.name,&stu.sex,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);

§10.2结构体数组 定义:结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。 struct student {int num ; char name[20]; char sex; int age; float score; }; struct student stu[3] ; stu[0] stu[1] stu[2] 101 Lilin M 18 87.5 102 Zhanghua 99 103 Wuli F 19 78.5

结构体数组初始化: 结构体类型名 结构体数组名[n]={{初值表1},{初值表2}, ...,{初值表n}}; struct student {int num ; char name[20]; char sex; int age; float score; }; struct student stu[3]={{101,"Lilin",'M',18,87.5}, {102,"Zhanghua",'M',18,99},{103,'Wuli",'F',19,78.5}} ;

[例]定义结构类型struct std_info,定义一个结构数组stu,用于存储和显示三个学生的基本情况。 struct date {int year; int month; int day; }; struct std_info {int num ; char name[20]; char sex; struct date birthday; } stu[3]={{102,"Zhangsan",'M',{1980,9,20}}, {105,"Lisi",'M',{1980,8,15}}, {112,"Wangwu",'F',{1980,3,10}} }; main() { int i; printf("No. Name Sex Birthday\n"); for(i=0; i<3; i++) { printf("%-7d",stu[i].num); printf("%-9s",stu[i].name); printf("%-4c",stu[i].sex); printf("%d-%d-%d\n",stu[i].birthday.year, stu[i].birthday.month,stu[i].birthday.day); } } 程序运行结果: No. Name Sex Birthday 102 Zhangsan M 1980-9-20 105 Lisi M 1980-8-15 112 Wangwu F 1980-3-10

}leader[3]={“Lian”,0,“ABian”,0,”Song“,0}; main() <例> 统计后选人选票 struct person { char name[20]; int count; }leader[3]={“Lian”,0,“ABian”,0,”Song“,0}; 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++; } for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); name count Lian ABian Song

§10.3 指向结构体类型数据的指针 指向结构体变量的指针 结构体变量在内存中的起始地址称为结构体变量的指针。 main() struct student { int num ; char name[20]; char sex; int age; float score; }; main() {struct student stu; struct student *p=&stu; p->num=101; strcpy(p->name,"lilin");} struct student { int num ; char name[20]; char sex; int age; float score; }; main() {struct student stu; struct student *p=&stu; (*p).num=101; strcpy((*p).name,"lilin");}

 引用结构体变量成员的三种形式: 结构体成员运算符"."和"->"的比较: 结构体变量.成员名 stu.num 若struct student stu; struct student *p=&stu;则 结构体变量.成员名 stu.num (*p).成员名 (*p).num p->成员名 p->num 结构体成员运算符"."和"->"的比较: 二者的优先级相同,自左向右结合 运算符"."前面只能是结构体变量名或(*p) 运算符"->"前面只能是指向结构体的指针变量名,不能是其它变量名 stu->num  设有以下语句: struct st{int n;struct st *next;}; static struct st a[3]={5,&a[1],7,&a[2],9,'\0'},*p; p=&a[0]; 则表达式( )的值是6。 A.p++->n B.p->n++ C.(*p).n++ D.++p->n 分析下列表达式: p->num p->num++ ++p->num D

 指向结构体数组的指针 说明: 如果指针变量p指向结构体数组,则p+1指向结构体数组的下一个元素,而不是当前元素的下一个成员。 p=stu; p=stu.name; (++p)->num (p++)->num struct student {int num ; char name[20]; char sex; int age; }; struct student stu[3]={{101,"Lilin",'M',18,}, {102,"Zhanghua",'M',18}, {103,'Wuli",'F',19,}} ; struct student *p=stu; main() {for( ; p<stu+3; p++) printf("%d,%s,%c",p->num,p->name,p->sex); } num name sex age stu[0] p stu[1] stu[2] p+1 

x y aa dt p 50 60 70 80 &dt[0] &dt[1] &dt[2] &dat[3] 10 20 30 40 p++ <练>下面程序的输出结果为( )。 struct st { int x; int *y; } *p; int dt[4]={10,20,30,40}; struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}; main() { p=aa; printf("%d\n",++p->x); printf("%d\n",(++p)->x); printf("%d\n",++(*p->y)); } A.10 B.50 C. 51 D.60 20 60 60 70 20 21 21 31

用结构体变量和指向结构体的指针作函数参数 用结构体类型数据作为函数参数有以下三种形式: 用结构体变量的成员作参数 用法与普通变量作参数相同,值传递 用结构体变量作参数 函数的实参和形参必须都是结构体变量,程序效率低,不主张用 用指向结构体变量的指针作参数 提高运行效率

§10.4 用指针处理链表 一、链表结构 链表的三要素: 头指针变量head-指向链表的首结点(链表中每一个元素称为一个结点) §10.4 用指针处理链表 一、链表结构 Head 1249 A 1356 B 1475 C 1021 D NULL 链表的三要素: 头指针变量head-指向链表的首结点(链表中每一个元素称为一个结点) 每个结点由2个域组成: 数据域-----存储结点本身的信息 指针域-----存储后继结点的指针(地址) 尾结点的指针域为NULL(空),作为链表结束的标志

§10.5 共用体 概念: 共用体类型的定义 ----与结构体类型的定义类似 使几个不同的变量占有同一段内存空间的结构称为共用体 union 共用体类型名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; union category { int class; char position[10]; }

共用体变量的定义----与结构体变量的定义类似 间接定义法: 先定义共用体类型,后定义共用体变量 直接定义法: 在定义共用体类型的同时,定义共用体变量 union data {int i; char ch; float f; }; union data un1,un2,un3; union data {int i; char ch; float f; }un1,un2,un3;

2000 2001 2002 2003 un1: ch i f union data {int i; char ch; float f; 注意:共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。 union data {int i; char ch; float f; }; union data un1,un2,un3; 2000 2001 2002 2003 un1: ch i f un1占用的内存空间为4字节(不是2+1+4=7字节)。

共用体变量的引用 特点 与结构体变量的引用一样,也只能逐个引用共用体变量的成员 un1=1; m=a;un1.i=1;m=un1.i; (1)系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,最后一次存入的成员值是起作用的。 例如,执行un1.i=1; un1.ch='c'; un1.f=3.14后,un1.f才是有效的成员。 (2)由于所有成员共享同一内存空间,故共用变量与其各成员的地址相同。 例如,&un1==&un1.i==&un1.ch==&un1.f。 (3)不能对共用体变量进行初始化(注意:结构体变量可以);也不能将共用变量作为函数参数,以及使函数返回一个共用体数据,但可以使用指向共用变量的指针。 (4)共用类型可以出现在结构类型定义中,反之亦然。

结构体与共用体 区别: 存储方式不同 联系: 两者可相互嵌套 struct node { char ch[2]; ch int k; a union node }b; a ch k b 变量的各成员同时存在 任一时刻只有一个成员存在

struct date { int day; int month; int year; union { int share1; 下面定义中sizeof(a)和sizeof(a.share)的值是? struct date { int day; int month; int year; union { int share1; float share2; }share; } a; 例 sizeof(a)=10 sizeof(a.share)=4

下面定义中变量w在内存中所占字节数? union aa { float x,y; char c[6]; }; struct st { union aa v; float w[5]; double ave; } w; 例 sizeof(w)=34

下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839  B.3938 C.380039   D.390038 共用体变量a 0011 1001 a.i[0] a.k 或s->i[0] 或s->k a.i[1] 在内存中存储 形式为 或s->i[1]

下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839  B.3938 C.380039   D.390038 共用体变量a 0011 1001 s->i[0] s->k 0011 1000 s->i[1] 在内存中存储 形式为

下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839  B.3938 C.380039   D.390038 共用体变量a 低字节 0011 1001 s->i[0] s->k 高字节 0011 1000 s->i[1] 故s->k在 内存中存储数据为: 0011 1000 0011 1001

若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a w.c[1]

若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1]

若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001

以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 1

以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 1

以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 5 1

以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 5 1

以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 6 5 1 运行结果: 60501

以下程序运行的输出结果是( )。 main() {union {char i[2]; int k; }r; r.i[0]=2;r.i[1]=0; printf("%d\n",r.k); } A.2    B.1    C.0    D.不确定 A

例 共用体变量e e.in.x e.a 或e.b e.in 程序运行的结果是________。 main() { union EXAMPLE { struct { int x; int y; }in; int a; int b; }e; e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d\n",e.in.x,e.in.y); } e.in.y

例 共用体变量e e.in.x e.a 或e.b 1 e.in 程序运行的结果是________。 main() { union EXAMPLE { struct { int x; int y; }in; int a; int b; }e; e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d\n",e.in.x,e.in.y); } e.in.y

例 共用体变量e e.in.x e.a 或e.b 2 1 e.in 程序运行的结果是________。 main() { union EXAMPLE { struct { int x; int y; }in; int a; int b; }e; e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d\n",e.in.x,e.in.y); } e.in.y

例 共用体变量e e.in.x e.a 或e.b 4 2 e.in 程序运行的结果是________。 main() { union EXAMPLE { struct { int x; int y; }in; int a; int b; }e; e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d\n",e.in.x,e.in.y); } e.in.y

§10.6 枚举类型 用途: 枚举类型的定义 enum 枚举类型名{取值表}; 枚举变量的定义----与结构体变量定义类似 如果一个变量只有几种可能的值,就可以定义成枚举类型 枚举类型的定义 enum 枚举类型名{取值表}; 例:enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat}; 枚举变量的定义----与结构体变量定义类似 间接定义:enum weekdays work; 直接定义:enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat } work;

说明: (1)枚举型仅适应于取值有限的数据。 例:1周7天,1年12个月。 (2)取值表中的值称为枚举元素,其含义由程序解释。 例:不是因为写成“Sun”就自动代表“星期天”。事实上, 枚举元素用什么表示都可以。 (3)枚举元素按常量处理,它们的值是定义时的顺序号(从0开始),所以枚举元素可以进行比较,比较规则是:序号大者为大! 例:上例中的Sun的值为0、Mon的值为1、……、Sat的值为6,所以Mon>Sun,Sat最大。 (4)枚举元素的值也是可以人为改变的:在定义时由程序指定。 例:如果enum weekdays {Sun=7, Mon=1 ,Tue, Wed, Thu, Fri, Sat};则Sun=7,Mon=1,从Tue=2开始,依次增1。 注意:不同的枚举元素不可以指定相同的值 (5)一个整数不能直接赋值给枚举变量 例:workday=2;(非法,因为类型不同) 改写成:workday=(enum weekday)2;

char *aa[]={"AA","BB","CC","DD"}; 下面程序的输出是( )。 main() { enum team{my,your=4,his,her=his+10}; printf("%d %d %d %d\n",my,your,his,her); } A.0 1 2 3 B.0 4 0 10 C.0 4 5 15 D.1 4 5 15 C 下面程序的输出是 。 main() { enum em{em1=3,em2=1,em3}; char *aa[]={"AA","BB","CC","DD"}; printf("%s%s%s\n",aa[em1],aa[em2],aa[em3]); } DDBBCC

§10.10 用typedef定义类型 关键字 作用:用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。 定义已有类型别名的方法 (1)按定义变量的方法,写出定义体; (2)将变量名换成别名; (3)在定义体最前面加上typedef。 例:给结构类型struct date定义1个别名DATE。 struct date { int year, month, day; }; (1)按定义结构变量的方法,写出定义体:struct date {……} d; (2)将变量名换成别名: struct date {……} DATE; (3)在定义体最前面加上typedef: typedef struct date {……} DATE; 例:给实型float定义1个别名REAL。 (1)按定义实型变量的方法,写出定义体: float f; (2)将变量名换成别名: float REAL; (3)在定义体最前面加上typedef: typedef float REAL; typedef int *ipoin; ipoin p;

说明 (1)用typedef只是给已有类型增加1个别名,并不能创造1个新的类型。 (2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。

3.若要说明一个类型名STP,使得定义语句STP s;等价于char *s;,以下选项中正确的是 2 .下面程序的输出是( )。 typedef union { long x[2]; int y[4]; char z[8]; } MYTYPE; MYTYPE them; main() { printf("%d\n",sizeof(them)); } A.32 B.16 C.8 D.24 1.设有以下定义 typedef union { long i; int k[5]; char c; } DATE; struct date { int cat; DATE cow; double dog; } too; DATE max; 则语句printf(〞%d〞,sizeof(struct date)+sizeof(max)))的执行结果是( )。 A.25   B.30     C.18     D.8 C 4.设有以下说明语句 typedef struct  { int n; char ch[8]; }PER; 则下面叙述中正确的是 A) PER 是结构体变量名  B) PER是结构体类型名 C) typedef struct 是结构体类型  D) struct 是结构体类型名 3.若要说明一个类型名STP,使得定义语句STP s;等价于char *s;,以下选项中正确的是 A) typedef STP char *s; B) typedef *char STP; C) typedef STP *char; D) typedef char* STP ; B D B

D) 程序中可用INTEGER代替int类型名 若有以下说明和定义 typedef int *INTEGER INTEGER p,*q; 以下叙述正确的是______。 A) p是int型变量 B) p是基类型为int的指针变量 C) q是基类型为int的指针变量 D) 程序中可用INTEGER代替int类型名 B