c语言课件14_tt_2共用体

合集下载

C语言程序设计PPT课件第12章 结构体和共用体

C语言程序设计PPT课件第12章 结构体和共用体

stu1 成员1 成员2 成员3 成员4
成 员
5
2019/8/29
27/60
12.4结构体指针的定义和初始化
当结构体嵌套时,如何访问结构体 指针变量所指向的结构体成员? pt
STUDENT stu1; STUDENT *pt = &stu1;
stu1. birthday. year = 2019; (*pt). birthday. year = 2019; pt -> birthday. year = 2019;
向函数传递结构体的完整结构 向函数传递结构体的首地址
2019/8/29
31/60
struct date {
int year; int month; int day; }; void func(struct date p) {
p.year = 2000; p.month = 5; p.day = 22; }
结构体变量 作函数参数
【例12.4】
Before function call:2019/04/23 After function call:2019/04/23
2019/8/29
32/60
struct date {
int year; int month; int day; }; void func(struct date *p) {
所以一个结构体在内存中的存储格式也是与机器相关的
2019/8/29
22/60
12.3结构体数组的定义和初始化
2019/8/29
23/60
12.3结构体数组的定义和初始化
2019/8/2建9 立了数据库中的多条记录,每条对应一个学生信息24/60

C语言编程:第十一章结构体与共用体

C语言编程:第十一章结构体与共用体
• 例如:表示一个学生的有关信息(学号,姓名,性 别 年龄,总分,地址),其具体数据情况如图所 示: num name sex age score addr
10010 Li Fun M 18 87.5 Bejing
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
11.3 结构体变量的引用
结构体变量的引用应该遵循以下原则 • 1)不能将一个结构体变量作为一个整体进行输入和
2)结构体名同标识 符命名规则;
3)分号不能省略
4)成员列表又称“域表”,每个成员也称为域。
5)指定一个结构体类型相当于指定了一个模型,它无 数据,系统对其不分配实际内存单元。
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
struct { int num;
char name[10]; char sex;
int age; float score; char addr[30]; } student1,student2;
(3)
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@

C语言程序设计结构体共用体及位运算PPT课件

C语言程序设计结构体共用体及位运算PPT课件

个结构。成员可以在程序中单独使用,与普通变量完全相同。表示结构变量
成员的一般形式是:

结构变量名.成员名

例如:

jilu1.bianhao
/*记录1的编号
*/
• */

jilu2.xingbie
这有点像数据库中的字段。 第5页/共38页
/*记录2的性别
• 12.1.4 结构变量的赋值
• 完成。
结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来
放一个英文字母或符号,一个汉字通常要用两个字节来存储。每一个字节都
有自己的编号,叫做“地址”。一个字节由若干位(位的英文是bit)组成。
至于一个字节由几个位组成,取决于计算机的硬件系统。一般由8位、16位
或32位组成,所对应的计算机也被称为“8位机、16位机或32位机”。目
前微机以16位机或32位机为主。但在本书中作为原理讲述的是8位机。

我们把若干字节组成一个单元,叫做“字”(英文为word)。
一个字可以存放一个数据或指令。
第20页/共38页
• 2 原码

我们知道,计算机使用的是二进制数。但这些数据有不同的编码
方式,分别有原码、反码和补码。

以8位计算机系统为例,我们把最高位(即最左面的一位)留做
表示符号,其他7位表示二进制数,这种编码方式叫做原码。最高位为“0”

示例:如x=01010011,y=x>>2,则
y=00010100。

注意,左移会引起数据的变化,具体说,左移一位相当于对原来
的数值除以2。左移n位相当于对原来的数值除以2n。

• 4 按位与

《C语言程序设计与数据结构》课件第09章结构体与共用体

《C语言程序设计与数据结构》课件第09章结构体与共用体

C语言程序设计与数据结构
C编译程序按照每个成员在结构体中声明的顺 序一一对应赋值,不可以跳过前面的成员直接给后 面的成员赋值,但是可以只给前面若干成员赋值, 后面没有赋值的成员由系统赋予默认值。
C语言程序设计与数据结构
3.结构体变量的引用 (1) 一般结构体变量的引用 一般结构体变量的引用是通过成员运算符“.”来实 现的,形式如下: 结构体变量名.成员名
学习重点: 结构体的概念; 结构体成员的引用。
C语言程序设计与数据结构
结构体概念的引入 (为什么需要结构体?)
C语言程序设计与数据结构
已经学习过的数据类型: 整形、实型、字符型 ,另外还有数组。 问题: 以上数据类型和数组是否完全满足编程需要? (例如:如何定义一个工人变量?)
C语言程序设计与数据结构
C语言程序设计与数据结构
上述五个数据项组成了工人的整体,这就是一 个结构体类型的数据,我们可以给这个数据命名为 worker,只要是worker类型的数据,都包括这五个 数据项。
C语言程序设计与数据结构
9.1 结构体类型的说明
C语言程序设计与数据结构
结构体类型是包含若干个相同或不同数据类型数 据项的集合,我们把这些数据项称之为结构体成员, 声明结构体类型的一般形式为: struct 结构体标识名 { 数据类型名1 结构体成员名表1; 数据类型名2 结构体成员名表2; ..... 数据类型名n 结构体成员名表n; };
C语言程序设计与数据结构
与同一类型的普通变量一样,结构体变量中的各个成 员也可以进行相应的各种运算,如: worker1.sex =„F‟; worker1. age++; worker1.salary=3000f;

C语言程序设计第9章结构体与共用体简明教程PPT课件

C语言程序设计第9章结构体与共用体简明教程PPT课件

//书名 //作者 //出版社 //价格
【例9.2】定义一个结构体类型struct student,描 述学生的基本信息,包含学号、姓名、性别和成绩
struct student { int num; //学号 char name[20]; //姓名 char sex; //性别, M-男,F-女 float score; //成绩 };
第9章
结构体与共用体
第9类型,但在实际问题中, 数据要复杂一些,往往具有不同的数据项和类型: 例如: 图书基本信息 用户自定义 学生基本信息 数据类型 球赛基本信息 ……
方法:创建结构体类型、共用体类型(或称为联合 体类型)和枚举类型
C语言程序设计 第9章 结构体与共用体 2
9.1 结构体类型
整 型
单精度型float
基本类型
实型(浮点型)
双精度型double
字符类型char
C 数 据 类 型
数组 构造类型
结构体struct 共用体union 枚举类型enum 指针类型
本章所介绍 空类型void 的数据类型
C语言程序设计
数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作
C语言程序设计
定义了结构体类型: struct book 定义了结构体变量: book1,book2;
第9章 结构体与共用体
14
• 方式三:
定义无名结构体类型的同时定义结构体变量
struct { 成员列表 } 变量名列表; struct { char name[40]; char author[100]; char publish[100]; float price; }book1,book2; 说明:第三种方法,由于没 有给出结构体类型标识符, 在实际应用中,此方法往往 是一次性的,适用于定义临 时的局部变量或者嵌套的结 构体成员变量。

共用体(共9张PPT)

共用体(共9张PPT)

共用体类型对于我们做一般情况下的编程,并不是很常用。
枚举类型变量的定义和使用
➢ 定义形式:
enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n};
➢ 定义方式: SINGLE f;
/*等价于float f;; */
例如:
typedef int INTEGER;
用已定义的枚举类型去定义变量: 共用体的概念及其变量的引用方式
【例7-3】构建最多可以拥有250个字符的字符串类型。
typedef char string[250];
string s;
/*等价于char s[250];*/
strcpy(s, "C Language");
【例7-4】把字符指针定义为字符串类型
typedef char* string;
string s1,s2;
union fourbyte 枚举类型变量的取值范围只能是其所枚举的各个常量,枚举变量的比较相当于比较它们所隐含的整数值,枚举类型变量的值是对应枚举常
量所代表整数值。
{ 枚举类型变量的定义和使用
typedef char* string;
long n; 对于上种方式也可省略枚举类型名:
再用这个类型定义一个变量n:
/*等价于char *s1,s2;*/
s1= "C Language";
s2=s1;
这样一来就使得自定义类型string更像C++和Java语言里 的字符串类型,变量s则更像Java里的字符串对象引用变量。
➢ 共用体所有成员的存储单元共用同一个存储单元,内存 长度是其最长的成员的长度,起作用的成员是最后一次 存放的成员。
主要是为了照顾有其他编程语言背景的人对C语言的使用。

计算机二级C语言 第14章 结构体、共用体和用户自定义类型

计算机二级C语言 第14章  结构体、共用体和用户自定义类型

typedef struct stu { char name[20]; int age; char sex; } Student; 定义Student表示struct stu的结构类型,然后 可用Student来说明结构变量: Student body1,body2;
typedef定义的一般形式为: typedef 原类型名 新类型名 有时也可用宏定义(#define)来代替typedef 的功能,但是宏定义是由预处理完成的,而 typedef则是在编译时完成的,它并不只是作简 单的字符替换。
2.结构数组的指针 设pt指向的结构变量 pt->number pt指向的结构变量的成员的number 的值 pt->number++ pt指向的结构变量的成员的 number的值,使用后加1 ++pt->number pt指向的结构变量的成员的 number先加1,再使用
设pt指向的结构数组 (pt++)->number 先使pt指向下一数组元素,得到 其number的值 pt++->number 等同于(pt++)->number (++pt)->number 得到pt当前指向数组元素的 number值,后使pt指向下一元素 3.结构指针变量作为函数参数 把一个结构变量的值传递到另一个函数,有 3种方式: (1)传递结构成员。 (2)传递结构变量。 (3)传递结构指针。
有了结构指针变量,就能更方便地访问结构 变量的各个成员。 其访问的一般形式为: (*结构指针变量).成员名 或 结构指针变量->成员名 例如: (*ps).number 或 ps->number 一个结构指针变量虽然可以用来访问结构变 量,但是,不能使它指向一个成员。也就是说 不允许取一个成员的地址来赋予它。

C语言程序设计教程第9章 结构体共用体PPT课件

C语言程序设计教程第9章 结构体共用体PPT课件

2020/7/30
10
举例:
定义结构体: struct stu
{ char num[20]; char name[20]; char sex; float score;
}; 声明结构体变量: struct stu student1, student2;
2020/7/30
11
② 声明结构体类型的同时定义结构体 变量
第9章 结构体、共用体
9.1 结构体类型概述
9.2 结构体类型变量的定义和引用
9.3 结构体数组
9.4 结构体与指针
9.5 结构体与函数
9.6 链表的基本操作
9.7 共用体类型数据的定义和引用
9.9 位运算和位段
9.10 自定义类型(typedef)
9.11 常见错误及改正方法
2020/7/30
1
整体 概述
struct 结构体名 {
成员表列 }变量名表列;
如: struct stu { char num[20];
char name[20]; char sex; float score; } student1, student2
2020/7/30
12
③ 直接定义结构体类型变量
struct { 成员表列 }变量名表列; 这种定义方法没有出 现结构体名,只能定义 变量一次。
表中,通常包括学在生C语的言中学称号为结、构姓体类名型、性别、年
龄、姓成名绩、年家龄庭性地别址民等族项文目化。程度数组住只址能按电序话号组码 织多字符个数同组 类整型型的字数符据字,符显然整我型 们不字符能数用组 一长个整数型
2020/7/30
4
组来存放这一组数据。
9.1.1 结构体类型定义

C语言共用体(Union)

C语言共用体(Union)

C语⾔共⽤体(Union)结构体和共⽤体的区别在于:结构体的各个成员会占⽤不同的内存,互相之间没有影响;⽽共⽤体的所有成员占⽤同⼀段内存,修改⼀个成员会影响其余所有成员。

结构体占⽤的内存⼤于等于所有成员占⽤的内存的总和(成员之间可能会存在缝隙),共⽤体占⽤的内存等于最长的成员占⽤的内存。

共⽤体使⽤了内存覆盖技术,同⼀时刻只能保存⼀个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共⽤体也是⼀种⾃定义类型,可以通过它来创建变量,例如:1. union data{2. int n;3. char ch;4. double f;5. };6. union data a, b, c;上⾯是先定义共⽤体,再创建变量,也可以在定义共⽤体的同时创建变量:1. union data{2. int n;3. char ch;4. double f;5. } a, b, c;如果不再定义新的变量,也可以将共⽤体的名字省略:1. union{2. int n;3. char ch;4. double f;5. } a, b, c;共⽤体 data 中,成员 f 占⽤的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占⽤ 8 个字节的内存,请看下⾯的演⽰:1. #include <stdio.h>2.3. union data{4. int n;5. char ch;6. short m;7. };8.9. int main(){10. union data a;11. printf("%d, %d\n", sizeof(a), sizeof(union data) );12. a.n = 0x40;13. printf("%X, %c, %hX\n", a.n, a.ch, a.m);14. a.ch = '9';15. printf("%X, %c, %hX\n", a.n, a.ch, a.m);16. a.m = 0x2059;17. printf("%X, %c, %hX\n", a.n, a.ch, a.m);18. a.n = 0x3E25AD54;19. printf("%X, %c, %hX\n", a.n, a.ch, a.m);20.21. return 0;22. }运⾏结果:4, 440, @, 4039, 9, 392059, Y, 20593E25AD54, T, AD54这段代码不但验证了共⽤体的长度,还说明共⽤体成员之间会相互影响,修改⼀个成员的值会影响其他成员。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

11.9 枚 举 类 型
枚举:指一一列出变量的值。 1)先用关键字enum定义枚举类型名称和各个枚举常量, 如定义枚举类型enum weekday为: enum weekday {sun,mon,tue,wed,thu,fri,sat}; 2)再用此类型来定义变量,如:
enum
weekday
workday, week_end;
a=a<<2
(左移两位)
左移n位相当于乘以2n。
6 )右移 用于将一个数的二进制位全部右移若干位。无符号数, 高位补0;有符号数,若符号位为0,若符号位为1,对于 Turbo C,填入最高位的是1。 a=a>>2 (右移两位)
右移n位相当于除以2n。
7 )扩展的赋值运算符:位运算符与赋值运算符的结合。
自定义类型(typedef)的使用方法
1. 2. 3. 4. 定义变量 变量名新类型名 加上 typedef 用新类型名定义变量 int i int INTEGER typedef int INTEGER INTEGER i;
int* p1 int* POINT typedef int* POINT POINTh; float f; }a,b,c;
printf(“%d”,a);
11.8.3 共用体类型数据的特点
1. 内存中每一瞬时只有一个成员起作用。
2. 起作用的成员是最后一次存放的成员。 3. 共用体变量的地址与其各成员的地址相同。 4. 不能在定义共用体变量时进行初始化。 5. 不能把共用体变量作为函数参数,也不能使函数带回共用体 变量,但可以用指向共用体变量的指针(类似结构体变量的用 法)。 6. 共用体类型可以出现在结构体类型定义中,也可以定义共用 体数组。反之,结构体也可以出现在共用体类型定义中,数组 也可以作为共用体的成员。
例11-9
struct { int num; char name[10]; char sex; char job; union { int class; char position[10]; } category ; } person[2] ; main() {int n , i; for (i=0;i<2;i++) { scanf(“%d”, &person[i].num);scanf(“%s”, person[i].name); scanf(“%c”,&person[i].sex);scanf(“%c”,&person[i].job); if (person[i].job=='s') scanf("%d",&person[i].category.class); else if (person[i].job=='t') scanf("%s",person[i].category.position); else printf("input error!"); }
&= a&=b a<<=2 |= >>= <<= ^=
相当于:a=a&b 相当于:a=a<<2
8 )不同长度的数据进行位运算
按右端对齐,正数和无符号数补0,负数补满1。
变量workday和 week_end被定义为枚举变量后,其值只能 是从sun到sat之一。 枚举变量也可直接定义,如:
enum {sun,mon,tue,wed,thu,fri,sat} workday,week_end ;
几点说明
1. 枚举元素不是变量,不能对它们赋值。 2. 编译时,系统按定义顺序将枚举元素的值设为0,1,2, …… 3. 枚举元素的值也可以在定义时指定。如: enum weekday {sun=7,mon=1,tue,wed,thu,fri,sat}; 4. 枚举值可以用作判断比较,如: if(workday==mon)…… if(workday > sun)……
DATE
DATE
birthday;
*p; /*p为指向结构体类型 数据的指针 */
几点说明
1 )用typedef可以定义各种类型名,但不能用来定 义变量。 2 )用typedef只是对已经存在的类型增加一个类型 名,而不能创造新的类型。 3 )常用typedef定义一些数据类型单独放在一个文 件中以供不同的源文件使用。 4 )使用typedef有利于程序的通用与移植。
11.8 共
11.8.1 共用体的概念


采用覆盖技术,使几个不同类型的变量(字节数 不同)共占同一段内存的结构,称为共用体类型的结 构。一般定义形式为: union 共用体名 union data 注意:共用体变量所 { int i; 占内存长度为最长的 char ch; {成员表列 成员的长度;而结构 float f; 体变量的长度是各成 }a,b,c; }变量表列; 员长度之和。
printf("\n"); printf("No. Name sex job class/position\n"); for (i=0;i<2;i++) {if (person[i].job=='s') printf("%-6d%-10s%-3c%-3c%-6d\n", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.class); else printf("%-6d%-10s%-3c%-3c%-6s\n", person[i].num, person[i].name, person[i].sex, person[i].job,person[i].category.position); } }
/* i、j用于计数 */ 定义新类型名DATE,它代表左边的一个 结构体类型,这时就可用DATE来定义变 量:
作用:定义新的类型名来代替已有的类型名,做到“见名知意”。 如:typedef int COUNT; COUNT i,j; typrdef struct {int month; 则 int day; int year; } DATE;
其比较规则是:未人为指定时按其在定义时的顺序号进行比较。
5. 不能直接将一个整数赋给一个枚举变量,但可使用强制 类型转换赋值,如 workday=2; workday=(enum workday=(enum
weekday)2; weekday)(5-3);
11.10
用 typedef 定 义 类 型
1)按位与 0&0=0 0&1=0 1&0=0 1&1=1
2 )按位或
0|0=0 0|1=1 1|0=1 1|1=1
3 )按位异或 0^0=0 0^1=1 1^0=1 1^1=0 4 )按位取反
用于对一个二进制数按位取反。它的优先级别高于算 术运算符、关系运算符、逻辑运算符和其它位运算符。
5 )左移 用于将一个数的二进制位全部左移若干位。低位补0。
int num[10] int NUM[10] typedef int NUM[10] NUM a <===> int a[10]
11.11 位 运 算
位运算符 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移
1)除“~”外,均为 二目运算符。 2)运算量只能是整 型和字符型。
地址 整型变量 字符变量 实型变量 1000 2字节 1字节 4字节
11.8.2 共用体变量的引用方式
引用原则:1)先定义后引用; 2)只能使用成员运算符“.”引用共用 体变量中的成员,不能引用共用体变量本身。
定义 union data 引用 a.i (引用共用体变量a中的整型变量i) a.ch (引用共用体变量a中的字符变量ch) a.f (引用共用体变量a中的实型变量f)
相关文档
最新文档