大学实用教程 C语言.

Slides:



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

第9章 用户建立的数据类型 公共计算机基础教研部.
程序设计导论 ——第15讲 结构与结构数组.
程序设计导论 结构与结构数组.
第7章 指针 存储地址的变量的类型就是指针类型 能直接对内存地址操作, 实现动态存储管理 容易产生副作用, 初学者常会出错
电子成绩单项目实现.
第10章 结构体与链表 本章要点: 结构体类型与结构体变量的定义 结构体变量的引用与初始化 结构体数组 链表处理 共用体类型和枚举类型
二级指针与二维数组.
6.4 字符串与指针 1. 用字符数组存放一个字符串.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C语言程序设计 第十二章 位运算.
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第九章 结构体 主讲教师 :贾月乐 电话:
第10章 结构体与共用体 概述 结构体 共用体 枚举类型.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
7.1 结构体类型 7.2 共用体 7.3 枚举类型 7.4 用typedef声明类型
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
第9章 结构体.
第7章 构造数据类型 构造数据类型:数组、结构体、共用体、用户自定义类型 7.1 数组
结构体和共用体 2 梁春燕 华电信息管理教研室.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
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 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
辅导课程六.
第五章 指针 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++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言复习3----结构体.
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
第十章 结构体与链表 西安工程大学.
第9章 用户自己建立数据类型 C语言提供了一些系统已定义好的数据类型,如int,float,char,用户可以用它们定义变量。
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
第九章 用户建立的数据类型.
C++复习2----类与对象.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第九节 赋值运算符和赋值表达式.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
结构体与共用体 结构体 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体 自定义数据类型 结构体类型定义
本节内容 结构体.
基本知识 数据类型、变量、常量、运算符.
第14讲 结构体和共用体 计算机与通信工程学院.
第18讲 从C到C++ 计算机与通信工程学院.
第八章 结构体和共用体 结构体类型和结构体变量 结构体数组 结构体指针变量 共用体.
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
安排座位.
Presentation transcript:

大学实用教程 C语言

第8章 结构体与共用体 问题的提出 结构体类型与结构体变量 结构体数组 结构体与函数 共用体

§8.1 问题的提出 如果只存储某班的某门课程的成绩,可使用一维数 组;只存储若干门课程的成绩,可用二维数组;对于 下表该如何组织数据,采用什么存储结构? 学号 姓名 性别 入学时间 计算机原理 C语言 编译原理 操作系统 1 令狐冲 男 2006 90 83 72 82 2 林平之 78 92 88 3 岳灵珊 女 89 98 66 4 任莹莹 95 87 5 …… 6

采用分散的一维数组结构 int studentId[30] = {1,2,3,4,5,6}; char studentName[10][30] = {{"令狐冲"},{"林平之"}, {"岳灵珊"},{"任莹莹"}}; char studentSex[2][30] = {{"男"},{"男"},{"女"},{"女"}}; int timeOfEnter[30] = {2006,2006,2006,2006}; int scoreComputer[30] = {90,78,89,78}; int scoreEnglish[30] = {83,92,72,95}; int scoreMath[30] = {72,88,98,87}; int scoreMusic[30] = {82,78,66,90};

数据的内存管理方式 90 78 89 …… 83 92 72 95 88 98 87 82 66 1 2 3 4 令狐冲 林平之 岳灵珊 任莹莹 男 女 2006 2000 4000 4E00 F010 10F0 EE00 CE00 6600

存储学生信息的设想 建立一个长度为30的数组,其中的每一个数组元素就是一个学生的学生考试信息,每一个数组元素的理想存储结构可为: StudentName TimeOfEnter Score_2 Score_4 StudentId StudentSesx Score_1 Score_3 学号 姓 名 性别 入学 原理 C 编译 OS 一个完整的变量

§8.2 结构体类型与结构体变量 格式 结构体名 成员、域 其中:标识符是定义的结构体类型名; 一、结构体的声明 struct 标识符 { 类型1 域名1; 类型2 域名2; …… 类型n 域名n; }; 格式 结构体名 成员、域 其中:标识符是定义的结构体类型名;

举例 定义学生档案的结构体 struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; };

struct personnel person; 二、定义结构体的变量 变量说明 struct 类型 变量名,……; struct personnel person;

struct personnel stu1, stu2; 1、先声明类型后定义变量 struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; }; struct personnel stu1, stu2;

等价 2、在声明同时定义变量 struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; }student1, student2; struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; }; struct personnel student1, student2; 等价

struct { int num; char name[10]; char sex; int age; float score; 3、直接定义结构类型变量 struct { int num; char name[10]; char sex; int age; float score; char addr[30]; }student1, student2;

4、成员也可以是一个结构体变量 如:struct date { int month; int day; int year; }; struct student { int num; char name[10]; struct date birthday; }stu1; num name birthday month day year

格式 struct 结构类型名 *指针名; 举例 struct student *p, stu1; p=&stu1; 5、定义指向结构体的指针变量 格式 struct 结构类型名 *指针名; 举例 struct student *p, stu1; p=&stu1; 指针p即指向结构体变量stu1的首地址。

格式 结构体变量名.域名 举例 输出学生档案数据 三、结构体变量的引用 1、圆点运算符 printf("%d",person.num); printf("%s",person.name); printf("%c",person.sex); printf("%d",person.age); printf("%f",person.score); printf("%s",person.addr);

struct personnel *p, stu1; p=&stu1; 2、箭头运算符 域表示 结构指针名->域名 举例 struct personnel *p, stu1; p=&stu1; p -> num 等价于 (*p).num

结构体变量引用说明 ⒈不能将一个结构体变量作为一个整体 进行输入和输出。下面是错误的: printf("%d,%s,%c,%d,%f,%s\n", student1); 而应按成员输入和输出。 printf(“%d\n”,student1.num); printf(“%s\n”,student1.name);

⒉如果成员本身又属一个结构体类型, 则要用若干个成员运算符,一级一级地 找到最低一级的成员。只能对最低一级 的成员进行赋值、存取和运算。 struct date struct student {int month; {int num; int day; char name[10] int year; struct date birthday; }; }student1,student2; 例如:student1.num student1.birthday.month

⒊对结构体变量的成员可以像普通变量一样进行各种运算。 ⒋可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 例如: scanf("%x", &student1.num); printf("%x", &student1);

思考题 struct point { int x; int y; }; struct rect { struct point pt1; struct point pt2; }; struct rect rt, *rp=&rt; 下面表达式哪些合法? rt.pt1.x (*rp).pt1.x rp->pt1.x rt->pt1.x 上面合法的表达式都是等价的吗?

5、结构体变量的初始化 struct personnel { long int num; char name[10]; char sex; int age; char addr[30]; }stu={89031, " li san ", 'm', 18, " 123 beijing road "};

§8.3 结构体数组 struct personnel { int num; char name[10]; char sex; 1、声明结构体 struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; };

格式 2、定义结构体数组 struct personnel { int num; char name[10]; char sex; int age; float score; char addr[30]; }; struct personnel stu[3];

struct personnel stu[3] ={ 3、初始化结构体数组 struct personnel stu[3] ={ {10101,"Li lin",'m',18,87.5,"103 Beijing road"} {10102,"Zhang li",'f',19,99,"130 Shanghai road"} {10103,"Wang bin",'m',20,78.5,"26 zhongshan road"} }; num name sex age score addr 10101 Li lin m 18 87.5 103 beijing road 10102 Zhang li f 19 99 130 shanghai road 10104 Wang bin 20 78.5 26 zhongshan road stu[0] stu[1] stu[2]

struct personnel stu[30], *p; p=stu; *p ⇔ stu[0] *(p+1) ⇔ stu[1] 4、结构体数组和指针 struct personnel stu[30], *p; p=stu; *p ⇔ stu[0] *(p+1) ⇔ stu[1] *(p+2) ⇔ stu[2] *(p+3) ⇔ stu[3] stu[1].num ⇔ (*(p+1)).num ⇔ (p+1)->num

5、结构体类型应用举例: (1)已知:struct sk { int a; float b; }data, *p; 若有 p = &data; 则正确的引用data 中成员a 的方是: (*p).data.a B. (*p).a C. p->data.a D. p.data.a B

printf(“%d,%d\n”,++p->x,(++p)->x); } (2)读程序,写出运行结果。 main() { struct { int x; int y; }s[2]={{1,2},{3,4}},*p=s; printf(“%d,%d\n”,++p->x,(++p)->x); } 4,3

§8.4 结构体与函数 把结构体传递给函数的方式有三种: 1.用结构体的单个成员作参数 在一般情况下,用单个成员作为实参给函数传递参数与普通的值传递没有分别,可看成普通的实参,是单向值传递,在函数内部对参数进行操作不影响结构体的变化。

main() { struct number { int num1; int num2; }num; num.num1=5; num.num2=4; f(num.num1, num.num2); . } void f(int m,int n) { for(i=1;i<=m;i++) for(j=1;j<=n;j++) printf(“*”); }

要求 举例 2、用结构体整体作为实参 实参和形参的数据类型相同(单向值传递) struct date { int year; int month; int day; }; void func(struct date p) p.year = 2000; p.month = 5; p.day = 22; } main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%d\n”,d.year, d.month, d.day); func(d); 举例

要求 实参和形参指向相同的数据类型。 举例 3、用指向结构体的指针作为实参 struct date { int year; int month; int day; }; void func(struct date *p) (*p).year = 2000; (*p).month = 5; (*p).day = 22; } main() struct date date1,*d=&date1; d->year = 1999; d->month = 4; d->day = 23; printf("%d,%d,%d\n",(*d).year, (*d).month, (*d).day); func(d); printf("%d,%d,%d\n",d->year, d->month, d->day); 举例

给已定义的数据类型定义别名。 功 能 举 例 typedef int integer; typedef struct student stu; 说明 struct student stu1, stu2; 等价于 stu stu1,stu2; 使用别名时,可不使用struct。

§8.5 共用体—联合体 什么是共用体? 是C语言提供的一种存储共享的设施。 即将若干个名称不同、类型不同的数据共 享同一存储单元。也就是使用覆盖技术, 几个长度不同的变量相互覆盖。

格式 变量序列是 可选项。 举例 说明 一、共用体类型的定义 union data{ int i; char ch; float f; }; 类型1 成员1; 类型2 成员2; …… 类型n 成员n; }[变量序列]; 变量序列是 可选项。 union data{ int i; char ch; float f; }; union data{ int i; char ch; float f; } a; 举例 说明 共用体所占存储单元长度是成员的最大者。

⒉结构体所占存储空间的大小是所有 成员所占空间大小的总和。 共用体所占存储单元的大小是所有 成员中占用空间最大的。 二、共用体与结构体的区别 ⒉结构体所占存储空间的大小是所有 成员所占空间大小的总和。  共用体所占存储单元的大小是所有 成员中占用空间最大的。 ⒈结构体的每一个成员都占用自己的 存储空间。  共用体的每个成员共享同一个存储 单元。

格式 变量名. 成员名 举例 说明 不能只引用共用体变量,例如: printf("%d", a); × 而应是: 三、共用体类型数据的访问 格式 变量名. 成员名 a.i 引用共用体变量a中的整形变量i a.ch 引用共用体变量a中的字符变量ch a.f 引用共用体变量a中的实型变量f 举例 说明 不能只引用共用体变量,例如: printf("%d", a); × 而应是: printf("%d", a.i); √ printf("%c", a.ch); √ printf("%f", a.f); √

四、共用体类型数据的特点 1.不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。 2.共用体变量可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。 3.共用体变量不能进行比较操作。

a.b.c1= a.b.c2= 五、共用体程序举例 0x34 0x12 #include <stdio.h> main() { union { int x; struct { char c1; char c2; } b; }a; a.x=0x1234; printf("a.b.c1=%#x\ta.b.c2=%#x\n",a.b.c1,a.b.c2); } 0x34 0x12