第9章结构体和共用体12(07)-
C语言中的结构体和共用体(联合体)
C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。
共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。
结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。
truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。
应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。
结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。
工作手册式C语言程序设计(第2版)课件 项目9 结构体与共用体
6
2 培养学生独立思考的能力。
任务3 师生信息统计
1. 共用体类型的含义
2. 共用体变量的定义
9.1 单个学生信息及成绩统计
9.1.1 结构体类型的定义
项目9 结构体与共用 体
结构体属于构造类型,其由若干个成员组成,成员的类型既可以是基本数据类型,也可以是构造类型,而且可以 互不相同。
结构体遵循“先定义后使用”的原则,其定义包含两个方面,一是定义结构体类型;二是定义该结构体类型的变 量。如平时所说的学生,它是一个群体的类型,而具体的张三、李四等对应学生类的某个对象,可将它的数据赋值给 学生类的相关变量。
9.3 师生信息统计
项目9 结构体与共用 体
【 例 9.5】编写程序引用共用体变o.h>
union data { int x;
char z;
};
int main( ) { union data d1;
d1.x=8;
d1.z="a";
printf("d1.x=%d\n",d1.x);
项目9 结构体与共用 体
3. 直接定义结构体变量 struct { 数据类型成员名1;
数据类型成员名2; …… 数据类型成员名n; }结构体变量; 例如: struct { int sno; char name[10]; char classname[20]; float grade[5]; }stu1; 小提示:采用这种方式定义的结构体没有类型名 称,会影响在后面的程序中定义同类型的变量。
第九章 结构体和共用体
– 【例9.5】用指向结构体变量的指针变量引用结构体变量
14
• (2)结构体数组的指针
– 结构体指针具有同其他类型指针一样的特征和使用方 法。结构体指针变量也可以指向结构体数组。同样结 构体指针加减运算也遵照指针计算规则。例如,结构 体指针变量加1的结果是指向结构体数组的下一个元素。 结构体指针变量的地址值的增量取决于所指向的结构 体类型变量所占存储空间的字节数。 – 【例9.6】有4名学生,每个学生的属性包括学号、姓名、 成绩,要求通过指针方法找出成绩最高者的姓名和成 绩。 – 程序设计分析:将学生信息存入数组中,通过指针依 次访问每一个学生信息,比较其分数,从而求出获得 最高分学生在数组中的位置。
– 在结构体变量定义之后对结构体变量赋值时可 以采用各成员赋值,用输入语句或赋值语句来 完成。 – 【例9.2】在定义后对结构体变量赋初值。 – 【例9.3】有两条记录,记录包括数量(num)和 价钱(price),编写一程序完成总价钱的计算。
11
9.2 结构体数组与结构体指针
9.2.1结构体数组
5
• ④结构体类型的定义只说明了该类型的构成形式,系统并 不为其分配内存空间,编译系统仅给变量分配内存空间 • ⑤结构体成员的类型也可以是另外一个结构体类型。如: 1. struct date 2. { int year; 3. int month; 4. int day; 5. }; 6. struct student 7. { 8. int num; 9. char name[20]; 10. char sex; 11. struct date birthday; 12. int score[5]; 13.}; • 结构体成员的类型如果是另外一个结构体类型,同样必须 遵守先定义后使用的原则。如上例中,先定义struct date类 6 型,再定义struct student类型。
结构体与共用体
4、共用体类型的变量如何赋初值,含义是什么?
不能对共用体变量名赋值,也不能在定义共用体变量时初始化。但可以用一个共用体变量为 另一个变量赋值
例:union
{ int i;
char ch;
double f;
}a={1,’a’,1.5}; ()
a=1;
()
m=a;
()
例:float x; union { int i; char ch; double f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; () x=a.f; ()
二. 枚举类型的应用
• 1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量
enum week{sun,mon,tue,wed,thu,fri,
sat};
enum week weekday,workday; ◆定义枚举类型的同时定义枚举变量 enum color {red,blue,green,black}a,b,c;
共用体类型的关键字
union 联合类型名 { 数据类型 成员名1 数据类型 成员名2
...........
数据类型 成员名n };
例:
union utype {
char ch; int i; float f; };
2、如何定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i;
◆直接定义枚举变量 enum {male,female}sex1,sex2;
枚举类型变量的特点
例 enum DAY {
MON=1, TUE, WED, THU, FRI, SAT, SUN };
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
结构体、共用体和枚举型
优缺点比较
优点
节省内存空间;可以方便地处理多种数据类型。
缺点
由于所有成员共享同一块内存空间,因此每次只能使用其中一个成员;使用不 当可能导致数据丢失或混乱。
优缺点比较
优点
增加了代码的可读性和可维护性;提供了类型检查,减少了 错误的可能性。
缺点
相对于整数类型,枚举型的处理速度较慢;占用内存空间相 对较大。
枚举型
枚举型通常用于定义一组命名的 整数值,这些值可以增加代码的 可读性和可维护性。例如,可以 使用枚举型来定义一周中的天数 或一个月中的月份。
优缺点比较
优点
可以方便地组合和管理多个不同类型 的数据;提供了数据的封装和隐藏, 增加了代码的安全性;可以方便地传 递和返回多个值。
缺点
相对于基本数据类型,结构体的处理 速度较慢;占用内存空间相对较大。
共用体在节省内存空间中的应用
节省存储空间
共用体允许在相同的内存位置存储不同的数据类型,通过共享内 存空间来节省存储空间。
实现多态性
共用体可以在不同的上下文中表示不同的数据类型,从而实现一 种多态性的效果。
处理异构数据
当需要处理不同类型的数据时,可以使用共用体来统一表示这些 数据,简化数据处理的过程。
实现多态性
通过共用体,可以在相同 的内存空间中存储不同类 型的数据,从而实现多态 性。
方便数据处理
在某些情况下,使用共用 体可以更方便地处理数据。
共用体的声明与定义
声明
定义
初始化
访问成员
注意事项
在C语言中,可以使用 `union`关键字来声明一 个共用体。例如: `union Data { int i; float f; char str[20]; };`
C语言第9章结构体、共用体、枚举
结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
第9章 结构体与共用体 教学PPT
9.1 结构体类型和结构体变量
• 9.1.2 结构体变量的定义
− 上个小节只是定义了结构体类型,它相当于一个模型,其中并无具体数 据,系统也不会为它分配实际的内存空间。为了能在程序中使用结构体 类型的数据,应该定义结构体类型的变量,并在其中存放具体的数据。
1.先定义结构体类型,再定义结构体变量 2.在定义结构体类型的同时定义结构体变量 3.直接定义结构体变量
9.7 进阶案例
• 求学生平均成绩
− 学习完了结构体与共用体的相关知识,接下来通过一个计算平均成绩 的案例来加深对结构体的理解,具体需求如下:
• 一个小组中有3个学生,每个学生修4门课程(三个学生修的课程 相同)
• 在程序中输入这3个同学的4门课程成绩,程序能自动计算出这4门 课程的小组平均成绩。
− 结构体变量作为函数参数的用法与普通变量类似,都需要保证调用函 数的实参类型和被调用函数的形参类型相同。结构体变量作函数参数 时,也是值传递,被调函数中改变结构体成员变量的值,主调函数中 不受影响。
9.4 结构体类型数据 在函数间的传递
• 9.4.2 结构体数组作为函数参数
− 函数间不仅可以传递一般的结构体变量,还可以传递结构体数组。接 下来,通过一个案例来演示如何使用结构体数组作为函数参数传递数 据,如例9-9所示。
结构体是一种构造数据类型,把不同类型的数据整 合在一起,每一个数据都称为该结构体类型的成员。
9.1 结构体类型和结构体变量
• 9.1.1 结构体类型定义
− 在程序设计中,使用结构体类型时,首先要对结构体类型的组成进 行描述,结构体类型的定义方式如下:
struct 结构体类型名称 {
数据类型 成员名1; 数据类型 成员名2; … 数据类型 成员名n; };
《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;
第9章 结构体、共用体和枚举类型
9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型
9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •
C语言学习入门笔记之结构体与共用体
结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。
上面的结构体声明中Student就是结构体名(结构体标记)。
2.花括号内是该结构体所包括的子项,称为结构体的成员。
“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。
例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。
C语言程序设计(第二版) 第9章结构体和共用体
9.2 结构体与结构体类型变量
9.2.1 结构体类型的定义
}; 声明一个结构体类型的一般形式为: struct 结构体名 { 成员列表 }; 【例9.1】 如果通讯地址表由下面的项目构成:
char email[30];
/*E-mail*/
E-mail 姓名 部门 家庭住址 邮编 电话号码 (字符串) (字符串) (字符串) (长整型) (长整型) (字符串)
(1)先定义结构体类型再定义结构体变量。 应当定义结构体类型的变量,并在其中存放具体的数 一般形式为: struct student struct student struct 结构名 据。定义方法有以下三种: { { { int num; int num; 结构体成员表列 char name[20]; char name[20]; }变量名表列; float score; float score; } boy1,boy2; }; struct student boy1,boy2; (3)直接定义结构体类型变量。 struct { 一般形式为: int num; struct char name[20]; { float scorce; 结构体成员表列 } boy1,boy2; } 变量名表列;
9.1 概述
在实际应用中,人们经常需要将不同类型的数 据作为一个整体来处理。
比如:要描述一个学生信息。
学号 姓名 (长整型) (字符串) 年龄 (整型) 性别 身份证号 家庭住址 (字符型) (长整型) (字符串)
struct student { long num; struct addr 在 C 语言中,结构体是不同数据类型的集合。 char name[20]; { int age; 在使用结构体这种数据类型之前,必须要先对其进 char name[20]; /*姓名*/ char sex; char department[30]; /*部门*/ 行定义,对结构体的定义包括结构体类型和结构体 long certificate; char address[30]; /*家庭住址*/ char address[40]; 变量的定义两部分。 long box; /*邮编*/ }; long phone; /*电话号码*/
C语言程序设计实例教程第2版习题答案作者李红第9章结构体和共用体.doc
9.4课后习题9.4.1项目练习一.练习目的1.进一步巩固结构体类型和共用体类型的定义与引川2.进一步复习链表的建立过程3.进一步巩固枚举类型的定义与枚举元索的引用方法二.练习内容1.用结构体变量表示平面上的一个点(横坐标和纵坐标),输入两个点,求两点Z间的距离。
#include "stdio.h"include "math.h"struct pin{float x;float y;}a,b;main(){printfC*请输入a点的横纵坐标:“);scanf("%f%f"/&a.x,&a.y);printfC'Xn");printf("请输入b点的横纵坐标scanf(,,%f%f"/&b.x,&b.y);printf("\n n);printff"输出a、b 两点之间的距离是:%f",sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));getch();}2.16个同学围成一-圈,从笫1个人开始按1、2、3的顺序报号,凡报到3者退出圈子。
找出最后昭在圈子中的人原来的序号。
ttinclude "stdio.h"#include "stdlib.h"#define LEN sizeof(struct game)struct game{int num;struct game *next;};struct game *creat(){ struct game *head,*p;head=p=(struct game *) malloc(LEN);p->num=l;int i=2;while(i<=16){ p・>next=(struct game *) malloc(LEN);p->next-:>nu m=i;i++;p=p->n ext; }p->next=head; return(head);} struct game *delete(struct game *head) { struct game*pl=head,*p2=head,*x; int k=l;while(pl->next!=pl) {if(k==3) {x=pl; pl=pl->next;p2・>n ext=pl; free(x); x=NULL; k=0;} else {P2=pl; pl=pl->next;}pl->next=NULL;return(pl);}void print(struct game *head){ struct game *p;p=head;while(p!=NULL) {printf("%d\t",p->num);p=p->n ext;}printfCAn");}main(){ struct game *pt,*p;pt=creat();p=delete(pt);print(p);free(p);getch();}3.建立一个链表,每个结点包含的成员为:职工号、工资。
C语言--第九章 结构体与共用体
free(pa);
h
19
3. 链表 链表概念:同一类型的结构体变量连接到一起,构成一个链, 各个结构体变量即为链表中的结点。 (1) 静态链表 所有结点都是在程序中定义的,不是临时开辟的,也不能用完后 释放,这种链表称为”静态链表”. 例如:
struct link
{
char ch;
struct link *p;
/* bk[0] bk[1] 3. 结构体指针初始化
bk[2] */
结构体类型数据的指针与其它类型数据的指针初始化相同
例如:struct stu
std,pers[3],*psd1=&std,*psd2=pers,(*p)[3]=&pers;
h
6
9.1.4 结构体类型数据的引用
1. 结构体成员的引用 若已定义了一个结构体变量和该类型的指针变量,并且该指针
p=&t; f(p); } 程序运行结果为:
C language 85
h
13
4. 结构体类型的函数 例9.5 找出成绩最高的学生记录,学生记录由学号和成绩组 成。
#include “stdio.h”
#define N 5
struct stu
{
char num[5];
float s;
};
struct stu fun(struct stu a[])
f(t); } 程序运行结果为:
C language 85
h
12
3. 传递结构体地址 形参结构体指针变量=实参结构体指针
例9.4 #include “stdio.h” struct ST
{ char str[20];int i;}; void f(struct ST *x) { printf(“%s\n%d\n”,x->str,x->i);} main() { struct ST t={“C language”,85},*p;
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 结构体类型定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第9章结构体和共用体12(07)-博雅研究谷-让信息技术更容易教学,在信息技术学习中更有效第9章结构和公地学习目标?掌握结构类型和变量的定义和初始化?掌握结构变量引用?掌握结构和数组、指针、函数等的组合。
掌握常见身体变量的定义和参考?理解结构和共享空间的内存分配机制前几章学习的数据类型是分散的,相互独立的。
例如,int a和char b 被定义为两个没有内部联系的变量。
然而,在现实生活和工作中,经常需要处理一些密切相关的数据,例如描述公司员工的姓名、部门、职位、电话号码和电子邮件地址。
因为这些数据类型不同,所以很难仅通过上一章学习的基本类型和数组来统一管理这些数据。
为此,C 语言提供了另外两种构造类型,即结构和公共体。
本章将详细解释这两种构造类型。
9.1结构类型和结构变量9.1.1结构类型定义结构是一种集成不同类型数据的结构数据类型。
每个数据都被称为结构类型的成员在程序设计中,当使用结构类型时,必须首先描述结构类型的组成。
结构类型定义如下:结构类型名称{ };数据类型成员名称1;数据类型成员名称2;......数据类型成员名称n;在上述语法结构中,“struct”是定义结构类型的关键字,后跟定义的“结构类型名称”。
在“结构类型名称”下的括号中,定义了结构类型的成员项,每个成员由“数据类型”和“成员名称”组成例如,为了描述一组学生信息,信息由学生编号(数字)、姓名(姓名)、性别(性别)、年龄(年龄)、地址(地址)等组成。
我们可以使用以下语句来定义一个名为“学生”的结构类型:1学归-使信息技术教学更简单,信息技术学习更有效结构学生{ };整数;char name[10];迷人的性;国际年龄;char地址[30];在上述结构类型的定义中,结构类型学生由5个成员组成,即人数、姓名、性别、年龄和地址值得一提的是,结构类型中的成员也可以是结构变量。
例如,出生日期信息被添加到学生信息中。
具体代码如下:结构日期{ };结构学生{整数;char name[10];迷人的性;结构生日;年份;国际月;国际日;} stu 1;在上面的代码中,我们首先定义了结构类型Date,它由三个成员组成:年、月和日。
然后定义结构变量stu1,其中成员生日是日期结构类型学生的类型结构如图9-1所示。
numnamemesexexyearyearbydaydaydaydaymonthmonthyday图9-1结构类型学生类型结构注:1,结构类型定义以关键字struct开头,后跟结构类型的名称,其命名规则与变量名相同。
2,在定义了一个结构类型之后,并不意味着立即分配一个存储单元来存储每个数据成员,它只是告诉编译器结构类型是由哪些数据类型的成员组成的,每个成员占用多少字节,以什么格式,并把它们作为一个整体来处理3,结构类型定义末尾括号后的分号是必不可少的4,结构类型的成员可以是结构变量,但不能是其自身结构类型的变量9.1.2结构变量的定义前一节只定义了结构类型,它只相当于一个模型,其中没有特定的数据,系统不会为其分配内存空间。
为了在程序中使用结构类型的数据,应定义结构类型的变量,并在其中存储2博雅研究谷-使信息技术教学更简单,信息技术学习更有效地输入特定数据。
以下是定义结构变量的三种方法1。
首先定义结构类型,然后定义结构变量,就可以定义结构变量。
定义结构变量的语法格式如下:结构类型名称结构变量名称;例如:structure studenty1,student 2;以上示例定义了结构类型变量stu1和stu2,当变量stu1和stu2具有结构特征时,它们各自存储一组基本类型变量,如图9-2所示stu1:stu2:201403001201403001张三张三201403002201403002李云满满满满满女23232525北京上海图9-2变量stu 1和stu 2的存储结构。
从图9-2可以看出,变量stu1和stu2分别占据连续的存储空间2.定义结构类型时定义结构变量与第一种方法具有相同的功能,其语法格式如下:结构类型名称{数据类型成员名称1;数据类型成员名称2;......数据类型成员名称n;}结构变量名称列表;例如:struct student {int num;char name[10];迷人的性;} stu1、stu2在定义结构类型student时,上面的代码还定义了结构类型变量stu1和stu2变量stu1和stu2中包含的成员的数据类型是相同的3,结构变量的直接定义除了上述两种方法外,我们还可以用以下语法直接定义结构变量: struct {数据类型成员名称1;数据类型成员名称2;…数据类型成员名称n;}结构变量名称列表;例如:3博雅研究谷-使信息技术更容易教学,对信息技术学习更有效结构{int num;char name[10];迷人的性;} stu1、stu2上面的代码也定义了结构变量stu1和stu2,但是以这种方式定义的结构没有类型名,我们称之为匿名结构。
注意:结构类型是用户定义的数据类型。
它不会在编译时为结构类型分配空间,就像前面描述的简单数据类型一样。
只有当它被用来定义一个变量时,结构变量才会被分配结构类型所需大小的存储单元9.1.3结构变量的内存分配一旦定义了结构变量,系统将为其分配内存结构变量占用的内存大小是根据字节对齐机制分配的。
字节对齐意味着字节按照一定的规则排列在空间中。
一般来说,字节对齐满足以下两个原则:(1)结构的每个成员变量相对于该结构的第一个地址的偏移量是基本数据类型(不包括结构、数组等)大小的整数倍。
)的成员变量;如果没有,编译器将在成员之间添加填充字节接下来通过一个案例打印每个成员变量的地址,如示例9-1所示例9-11 #include2 //直接定义结构变量3 struct4 {567 8char a;双b;int c;短d;9 } s;10 void main()11 { 12 13 14 15 17 }printf(\成员变量a的地址:%d\\n\printf(\成员变量b的地址:%d\\n\printf(\成员变量c的地址:%d\\n\printf(\成员变量d的地址:%d\\n\16 printf(\成员变量d的地址:% d \ \ n \| 16)4博雅研究谷-使信息技术更容易教信息技术,更有效地学习信息技术图9-3运行结果从图9-3可以看出,结构变量中成员变量的地址被打印出来。
结构变量s中每个成员占用的内存如图9-4所示图9-4的结构变量中每个成员占用的内存。
接下来,根据图9-3和9-4,逐步分析每个成员变量的地址:?成员变量A的地址是3703968,也是结构变量S的第一个地址;?成员变量B的地址是3703976,与结构变量的第一个地址的偏移量是8字节。
这是因为是成员变量B的基本数据类型,它是双精度的,并且它的偏移量应该是8的倍数(sizeof(double)),所以变量A用7个字节填充;?成员变量C的地址是3703984,与结构变量第一个地址的偏移量是16,这是变量A和变量B占用的内存大小之和,正好是4的倍数(sizeof(int));?成员变量D的地址是3703988,与第一个地址的偏移量是20字节。
它是变量A、B和C占用的个内存大小的总和,正好是2的倍数(sizeof(short))(2)结构的总大小是该结构最宽的基本类型成员大小的整数倍。
如果不够,编译器将在最后一个成员后添加填充字节。
通过实例9-1的分析,结构变量S的内存大小可以计算为22,但这不符合字节对齐的第二个标准。
示例9-1中的结构变量的内存大小将如下例9-2所示打印。
例9-21 #包括2结构3 { 4 5 6 7chara;双b;int c;短d;8 } s;9 void main()10 { 11 12 }printf(\内存中结构变量s的大小:%d\\n\运行结果如图9-5所示5博雅研究谷-使信息技术更容易教信息技术,更有效地学习信息技术图9-5运行结果从图9-5可以看出,结构变量s的内存大小是24字节,而不是22字节这是因为结构的总大小应该是最宽基类型的成员大小的整数倍成员变量中最宽的基本类型的大小为8(双倍),因此在d之后填充2字节,结构变量s占用的内存大小为24字节内存分配如图9-6所示占用1字节来填充7字节s成员aa占用8字节成员bb占用4字节成员cc占用2字节来填充2字节成员dd图9-6结构s占用总内存大小应该注意,如果结构中有结构类型变量,如结构中的char类型数组成员,则其偏移量基于数组中的元素类型,即偏移量是1的倍数(sizeof(char))对于int类型的数组,偏移量是4的倍数(sizeof(int))关于结构变量的分配,不同的编译器有不同的分配规则。
读者可以理解。
在实际应用中,sizeof()运算符可用于快速找到结构变量的大小。
9.1.4结构变量的初始化由于结构变量存储一组不同类型的数据,初始化结构变量的过程实际上就是初始化结构中每个成员的过程根据定义结构变量的不同方式,有两种初始化结构变量的方法。
1。
定义结构类型和结构变量时初始化结构变量。
具体例子如下:结构学生{整数;char name[10];迷人的性;}斯图= {20140101。
\上述代码在定义结构变量stu时初始化了它的成员 2.定义结构类型后,初始化结构变量。
具体例子如下:结构学生{ };结构学生数= {20140101,\整数;char name[10];迷人的性;在上面的代码中,首先定义了一个结构类型Student,然后在定义结构变量时初始化它的成员6博雅研究谷-让信息技术更容易教学,对信息技术学习更有效?注意:当初始化一部分成员变量时,如果只有一部分成员被初始化,前一个成员应该被初始化,后一个成员可以是自由的,因为当分配成员变量时,编译器在成员之间进行匹配,而不是根据数据类型自动匹配一些成员可以被初始化,然后打印出来,如例9-3所示。
例9-3# includes tructstudent {int num;char name[10];迷人的性;}斯图= { 20140101,’ M ‘ };void main(){printf(\printf(\ printf(\ })运行如图9-7所示。
图9-7运行结果如图9-7所示,在结构变量stu中只分配了num和sex,但当输出所有成员的值时,“M”被分配给name,sex没有值对9.1.5结构变量的引用定义并初始化结构变量以使用结构变量中的成员在C语言中,引用结构变量成员的方式如下:结构变量名。
成员名称;例如,以下语句用于引用结构变量stu1中的num成员:stu 1 . num;为了帮助大家更好地掌握结构变量的使用,通过一个案例输出结构变量中所有成员的值,如例9-4所示。