结构体与共用体
c语言结构体共用体数据类型求大小例题
![c语言结构体共用体数据类型求大小例题](https://img.taocdn.com/s3/m/c71d034f03768e9951e79b89680203d8ce2f6a1d.png)
c语言结构体共用体数据类型求大小例题(原创版)目录一、C 语言结构体和共用体的概念二、结构体和共用体的大小计算方法三、例题解析四、总结正文一、C 语言结构体和共用体的概念C 语言中,结构体和共用体是两种特殊的数据类型,它们都可以用来描述一个复合数据类型。
结构体和共用体的主要区别在于它们存储数据的方式不同。
结构体是一种复合数据类型,它可以包含多个不同类型的成员变量。
结构体中的成员变量按照定义的顺序排列,并且每个成员变量都有一个唯一的名字。
结构体可以看作是一个数据容器,它可以存储多个相关类型的数据。
共用体是一种特殊的结构体,它的每个成员变量都共享同一段内存空间。
共用体的每个成员变量都有一个基地址,它们之间的关系是连续的。
共用体的大小等于其最大成员变量的大小。
二、结构体和共用体的大小计算方法结构体和共用体的大小计算方法相同,都是按照定义的顺序依次计算每个成员变量的大小,并累加得到总体大小。
需要注意的是,结构体和共用体的大小通常会进行对齐处理,以提高数据访问的效率。
三、例题解析假设有一个结构体如下:```cstruct example {int a;char b;float c;};```首先,我们需要知道每个成员变量的大小。
在 32 位系统下,int 类型占用 4 个字节,char 类型占用 1 个字节,float 类型占用 4 个字节。
因此,结构体 example 的大小为:```size = 4(int a 的大小) + 1(char b 的大小) + 4(float c 的大小)= 9```接下来,我们需要考虑对齐问题。
在 32 位系统下,数据对齐的粒度是 4 个字节。
因此,结构体 example 的大小应该为 4 的倍数。
由于 9 不是 4 的倍数,所以需要进行对齐处理。
将结构体 example 的大小调整为 12,这样每个成员变量都可以从 4 的倍数地址开始存储。
```size = 12```因此,结构体 example 的大小为 12 字节。
结构体与共用体
![结构体与共用体](https://img.taocdn.com/s3/m/22b28b7fba0d4a7302763ae3.png)
10. 1 结构体数据
• 【注意】 • (1) 不能将一个结构体变量作为一个整体进行赋值和输出; 只能对其各
个成员分别输出。 • ( 2) 对成员变量可以像普通变量一样进行各种运算。例如: • sumage = stu1. age + stu2. age; • (3) 既可以引用成员的地址, 也可以引用结构体变量的地址。例如: • printf("score = %f",stu2. score); • (4) 若成员本身还属于一个结构体类型, 则只能对最低级的成员进行赋
给出结构变量。 • 三种方法中声明的stu1、stu2 变量都具有图10. 1 所示的结构。
上一页 下一页 返回
10. 1 结构体数据
• 这说明变量stu1、stu2 为student 类型后, 即可向这两个变量中的各 个成员赋值。在上述结构体定义中, 所有成员都是基本数据类型或数 组类型。
• 【注意】 • (1) 类型与变量是不同概念, 不要混淆。 • (2) 结构体中的成员, 可以单独使用, 其作用与地位相当于普通变量。 • (3) 成员也可以是一个结构体变量。 • (4) 成员名可以与程序中的变量名相同, 二者不代表同一对象。
• };
• 在这个结构体数据类型定义中, struct 是C 语言关键字, student 是结 构体名, 该结构体由5 个成员组成。第1 个成员为num, 字符串变量; 第2 个成员为name, 字符串变量; 第3个成员为age, 整型变量; 第4 个 成员为sex, 字符变量; 第5 个成员为score, 实型变量。
下一页 返回
10. 1 结构体数据
• 例如, 上述学生信息数据的描述可以定义结构体数据类型为
• struct student
结构体与共用体
![结构体与共用体](https://img.taocdn.com/s3/m/9b15ff2a783e0912a2162a8f.png)
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) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
第9章 结构体与共用体 教学PPT
![第9章 结构体与共用体 教学PPT](https://img.taocdn.com/s3/m/25a8a80926fff705cd170a67.png)
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语言程序设计——结构体和共用体(完整版)
![C语言程序设计——结构体和共用体(完整版)](https://img.taocdn.com/s3/m/ce874ede84254b35eefd349d.png)
printf(“name\tage\tjob\tclass/office\n”); for(i=0;i<PN;i++) {if(body[i].job==„s‟) printf(“%s\t%d\t%3c\t%d\n”,body[i].name, body[i].age,body[i].job,body[i].units.class); else printf(“%s\t%d\t%3c\t%s\n”,body[i].name, body[i].age,body[i].job,body[i].units.office); } }
birthday num name sex age month day year addr
§12.3结构体数组
结构体数组的每一个元素都是具有相同结构类型 的结构体变量。 例:struct student {int num; char name[20]; float score; }stu[3]; 其中,定义了一个结构体数组stu,共有3个元素, 每个元素都具有struct student的结构形式。
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。
第7章 (PLASMA)
![第7章 (PLASMA)](https://img.taocdn.com/s3/m/9463bf7f1711cc7931b7167e.png)
7.2.1 结构体变量的定义
struct grade { int math; int C_language; int english; float average; }; struct student { long number;
7.2.1 结构体变量的定义
7.3 结构体变量的引用
7.3.1 引用结构体变量的成员 7.3.2 两个相同类型的结构体变量之间相互赋值 7.3.3 结构体变量在函数间的传递
7.3.1 引用结构体变量的成员
任何一个结构体变量不能作为整体输入或输出,为了 实现变量的输入、输出操作,需要对变量中的每一个 成员进行引用。引用结构体变量中成员的方式为: 结构体变量名.成员名 其中,“.”称为成员运算符,具有极高的运算优先 级。若结构体多层嵌套,则需要用若干个成员运算符, 一级一级找到最低一级的成员,只能对最低级的成员 进行赋值、存取或运算。引用内层成员的一般形式是: 结构体变量名.成员名1.成员名2.„.成员名n
7.1 结构体类型的定义
在前几章中,我们已经学习了C语言所提供的一些基本 数据类型,如char、int、float、double等,也学习 了由相同数据类型所组成的数据的集合——数组。但 是在现实生活的很多领域中,经常需要处理一些具有 不同数据类型的数据。例如,处理一个学生的信息时, 学生的学号、姓名、性别、年龄等信息作为学生的属 性,需要作为一个整体来处理。如果采用简单的基本 数据类型来操作,则难以反映出它们之间的内在联系, 并且使程序冗长,降低数据处理的效率,且易出错误。 因此,在C语言中引入了一种能够处理复杂数据的数据 类型——结构体类型。
7.2.2 结构体变量的初始化
或者 struct student wang_lin={0601005,“wang lin”,“M”,19,“Shenyang University of Technology”}; 也可以像数组一样进行不完全的初始化,例如: struct student wang_lin={0601005,“wang lin”,“M ”};
结构体与共用体
![结构体与共用体](https://img.taocdn.com/s3/m/aca1661ea76e58fafab0035c.png)
结构体与共用体
例如:20020945
有如下定义:struct sk
{int a;float b;} data;
int *p 则要使p指向data中的a域,正确的赋值语句是:C (A)p=&a;错误在于结构体变量的成员,必须通过定义的结构
体变量的名来引用其成员
(B)p=&data.a; data.a就是变量的值,而不是成员a地址
(C)p=&data.a;
(D)*p=data.a 同B解释
“()”优于“->”(指向)优于“++”
结构体类型还允许嵌套定义!
使用共用体类型数据时要注意:1,同一段程序可以用来存放几种不同的数据,但是在读写瞬间只能存放其中一种,而不是同时存放几种。
系统分配的空间为其中一个所需内存最大的成员的空间,不累加!!!
共用体变量的地址和他的各成员的地址都相同,即无论哪个成员起始地址都相同(参考19960946)。
typedef 原类型名新类型名
typedef v1 int v3
typedef 可以声明各种类型名,但是不能用用来定义变量。
他只为已存在的类型增加一个类型名,并不是创造新类型。
(参考20000930和20020947)。
结构体与共用体
![结构体与共用体](https://img.taocdn.com/s3/m/b1491c73c281e53a5802ff82.png)
一、结构体(structure)
C语言允许用户自己指定这样一种数据结构,即将不同类型的数据组合成一个有机的整体以便于引用。
二、共用体
使几个不同的变量共占同一段内存的结构。
三、枚举类型
1、如果一个变量只有几种可能的值,可以用此方法定义。
2、声明枚举类型用enum开头。
3、说明:(1)在C编译中,对枚举元素按常量处理;
(2)C语言编译按定义时的顺序使它们的值为0,1,2…,也可以改变枚举元素的值,在定义时由程序员指定;
(3)枚举值可以用来作判断比较;
(4)一个整数不能直接赋给一个枚举元素,只有进行强制类型转换才能赋值:workday=(enum weekday)2;
四、用typedef定义类型。
结构体与共用体小结
![结构体与共用体小结](https://img.taocdn.com/s3/m/0767a069182e453610661ed9ad51f01dc28157da.png)
结构体与共用体小结结构体和共用体是C语言中非常重要的数据类型。
它们在存储和组织数据方面提供了更灵活的选择。
本文将从定义、声明、初始化、使用和比较等方面对结构体和共用体进行详细讨论。
一、结构体(Struct)结构体是一种能够存储不同类型数据的自定义数据类型。
它允许将不同类型的数据组合在一起,形成一个逻辑上的实体。
1.定义和声明结构体的定义使用关键字`struct`,可以像定义其他变量一样定义结构体。
例如:```cstruct Studentint id;char name[20];int age;};```在定义结构体后,可以使用该结构体类型声明变量。
例如:```cstruct Student stu1;```也可以一步完成结构体类型定义和变量声明。
例如:```cstruct Studentint id;char name[20];int age;} stu1;```2.初始化结构体变量可以使用初始化列表初始化。
例如:```cstruct Student stu1 = {1001, "John", 20};```3.使用结构体变量的成员可以通过`.`运算符访问。
例如:```cstu1.id = 1001;strcpy(, "John");stu1.age = 20;```4.比较结构体不能直接比较,但可以通过定义比较函数来比较。
例如:```creturn (stu1.id == stu2.id && strcmp(, ) == 0 && stu1.age == stu2.age);```二、共用体(Union)共用体是一种特殊的数据类型,它允许不同类型的成员共享同一块内存空间。
共用体的成员在内存中是相互重叠的,只有一个成员可以被赋值和使用。
1.定义和声明共用体的定义使用关键字`union`,可以像定义其他变量一样定义共用体。
例如:```cunion Dataint i;float f;char str[20];};```在定义共用体后,可以使用该共用体类型声明变量。
c语言第11章-结构体与共用体
![c语言第11章-结构体与共用体](https://img.taocdn.com/s3/m/f3a39a14c950ad02de80d4d8d15abe23482f0330.png)
}
§11.6 构造体和指针
ma指in向() 构造体变量旳指针
{ s❖tr定uc义t st形ud式en:t struct 构造体名 *构造体指针名; { 例lonsgtruicntt sntuudmen;t *p; char name[20]; ❖使str用ucch构tars造tsued体xe;n指t 针变存量储引构用造组体p员变形量式在内存旳起始地址
struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Roa
形式二:
struct 构造体名
{ 类型标识符 组员名; 类型标识符 组员名;
……………. }构造体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
❖用构造体变量旳组员作参数----值传递 ❖用指向构造体变量或数组旳指针作参数----地址传递 ❖用构造体变量作参数----多值传递,效率低
例 用构造体变量作函数参数
(main)
struct data { int a, b, c; };
accacbbb::::::::2332333370070
main()
}
指向构造体数组旳指针
例 指向构造体数组旳指针
struct student { int num;
char name[20]; char sex; int age;
p num
name
sex
p+1
age
结构体与共用体
![结构体与共用体](https://img.taocdn.com/s3/m/bf54491dad51f01dc281f1f2.png)
2020/12/16
15
8.1 结构体
8.1.2 结构体数组
定义结构体数组的方法和结构体变量相似:
(1) struct 结构体名 {成员表列} 数组名[数组长度];
(2) 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名[数组长度];
例8.3 编写程序,利用结构体数组存储和显示三个学生的信息。 算法描述:首先定义并初始化一个结构体数组,然后通过printf 函数输出到屏幕上即可。
return 0;
}
2020/12/16
17
8.1 结构体
程序分析: 程序中定义了一个外部结构体数组stu,共3个元 素,并作了初始化赋值。在main函数中用for语句 逐个输出各元素的各个成员值。
2020/12/16
18
8.1 结构体
8.1.3 结构体指针
指向结构体变量的指针
例8.4 使用指向结构体变量的指针来访问结构体变量的 各个成员。
struct student
{ int num;
char name[10];
float score; };
int main ()
{struct student stu[3]={{1, "Wang", 90.0}, {2, "Qian", 89.5}, {3, "Sun", 85.0}};
struct student *p; int i;
注意 : (1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号 括起来的一些常量。如:
struct Student a={10001,"Li Ming",'M',"Bei Jing"};
共用体和结构体的区别
![共用体和结构体的区别](https://img.taocdn.com/s3/m/9f5a590943323968011c92e0.png)
其中,struct 是结构体关键字,一定不能省略。 node 是结构体名,可以省略,成为无名结构体。 结构体成员可以使基本类型或者构造类型。 3、特点 变量用.访问,指针用 ->访问。eg. node.num = 1; node->ame = abc; 共用体 1、共用体的作用 用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占一段内存 的结构。共用体的所有成员都在一段内存中存放,起始地址一样,并且同一 时刻只能使用其中的一个成员变量。
2、结构体总空间大小,等于各成员总长度,共用体空间等于最大成 员占据的空间。 3、共用体不能赋初值而结构体可以。
2、共用体的定义 共用体如下所示, 其中 union 是共用体关键字,不能省略。node 是共用体名。 3、特点 用体内存长度是内部最长的数据类型的长度。 共用体的地址和内部各成员变量的地址都是同一个地址 主要区别 1、结构体每一位成员都用来表示一种具体事务的属性,共用体成员 可以表示多种属性(同一存储空间可以存储不同类型的数据) 。
共用体和结构体的区别
在 c++中,结构体(struct)和共用体(union)是两种很相似的复合 数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别。 结构体 1、结构体的作用 在网络协议、通信控制、嵌入式系统的 C/C++编程中,我们经常要传 送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就 是一个结构体。 2、结构体的定义 结构体:是指定义相应的数据结构及相应的变量。 结构体如下所示,
《结构体和共用体》PPT课件
![《结构体和共用体》PPT课件](https://img.taocdn.com/s3/m/2557d6803c1ec5da51e27031.png)
精选课件
13
在C语言的运算符中,取成员运算符“.”优先级最高, 故以上语句均为对引用之后的成员变量进行操作。若结构体 定义是嵌套的,则只能引用最低级的成员(用若干“.”运 算符,逐级引用到最低级)。如
stud3.birthday.year 是合法的,而
stud3.year 是非法的。
精选课件
14
2. 结构体类型变量可以整体引用来赋值。如stud2= stud1;即将变量stud1的所有成员的值一一赋给变量 stud2的各成员。结构体型变量只能对逐个成员进行输入或 输出,不可进行整体的输入输出,如:
};
有同样的地位和作分用号,不都可可少以用来定义变
量的类型。
精选课件
5
定义一个结构体类型的一般形式为: struct 结构体名
{ 类型标识符 成员1; 类型标识符 成员2; … 类型标识符 成员n;
};
成员的类型可为除该结构体类型外的任何一种类型,如 基本类型、指针类型和结构体类型。
精选课件
6
若定义结构体类型struct date如下:
10
3. 直接定义结构体类型变量,其一般形式为:
struct
{
成员表列;
}变量名表;
即不出现结构体名。如
struct
{char num[10];
char name[20];
char sex;
ቤተ መጻሕፍቲ ባይዱ
struct date birthday;
float score[3];
char tel[12];
}stud3,stud4;
结构体类型的名称
char sex;
结构体成员列表,
char birth在dasytr[u8c];t studen包t括类每型个起结作构用体的成范围内, float scorest[r3u]c;t student员和的系类统型提及供名的称标准类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.5 链表的概念
例如,一个存放学生学号和成绩的结点应为以下结构: struct stu {
9.1.1 结构类型变量的说明
3.直接说明结构变量 这种形式的说明的一般形 式为:
struct {
成员表列 }变量名表列;
例如: struct
{ int num; char name[20]; char sex; float score;
} stud1, stud2;
9.1.1 结构类型变量的说明
9.3.2 指向结构数组的指针
指针变量可以指向一个结构数组,这时结构指针变量的值 是整个结构数组的首地址。结构指针变量也可指向结构数组 的一个元素,这时结构指针变量的值是该结构数组元素的首 地址。
9.3.3 结构指针变量作函数参数
即用指针变量作函数参数进行传送。这时由实参传向形参 的只是地址,从而减少了时间和空间的开销。
9.2 结构数组的定义
数组的元素也可以是结构类型的。因此可以构成结构型数组,结构数 组的每一个元素都是具有相同结构类型的下标结构变量。
构造结构数组的方法和构造结构变量相似,只需说明它为数组类型即 可。
例如: struct stud
{ int num; char *name; char sex; float score;
{ int num; char *name; char sex; float score; } stud1,stud2;
stud1.num=102; ="Zhang ping"; printf("input sex and score\n"); scanf("%c %f",& stud1.sex,& stud1.score); stud2= stud1; printf("Number=%d\nName=%s\n", stud2.num, ); printf("Sex=%c\nScore=%f\n", stud2.sex, stud2.score); }
pc=(char *)malloc(100);
9.4 动态存储分配
2.分配内存空间函数 calloc calloc 也用于分配内存空间。 调用形式:
(类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的 连续区域。函数的返回值为该区域的首地址。 (类型说明符*)用于强制类型转换。 calloc函数与malloc函数的区别仅在于一次可以分配n块区 域。例如: ps=(struet stu*)calloc(2,sizeof(struct stu));
表示结构变量成员的一般形式是:结构变量名.成员名
例如:
boy1.num
即第一个人的学号
boy2.sex
即第二个人的性别
9.1.3 结构变量的赋值
结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。 【例9.1】给结构变量赋值并输出其值。 【程序代码】 #include <stdio.h> void main() { struct stud
数据类型 成员名2;
… 数据类型 成员名n; };
例如:union tag { int bh; float jg; char xm;};
9.6.2 共用体变量的说明
1.先定义共用体类型,再说明共用体变量。 如: union tag
{ int bh; float jg; char xm;
}; union tag data1, data2; 说明了两个变量data1和data2为tag共用体类型。
9.1.1 结构类型变量的说明
1.先定义结构,再说明结构变量 如: struct stud
{ int num; char name[20]; char sex; float score;
}; struct stud stud1, stud2; 说明了两个变量stud1和stud2为stud结构类型。也可以用宏定义使一 个符号常量来表示一个结构类型。
int num; int score; struct stu *next; }; 前两个成员项组成数据域,后一个成员项next构成指针域, 它是一个指向stu类型结构的指针变量。
链表的基本操作对链表的主要操作有以下几种: 1.建立链表; 2.指定结点的查找与输出; 3.插入一个结点; 4.删除一个结点;
有了结构指针变量,就能更方便地访问结构变量的各个成员。其访问 的一般形式为:
(*结构指针变量).成员名 或为: 结构指针变量->成员名 例如: (*pstu).num 或者: pstu->num 应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于 “*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义 就完全不对了。
这种形式的说明的一般 形式为:
struct 结构名
{ 成员表列
}变量名表列;
例如: struct stud
{ int num; char name[20]; char sex; float score;
} stud1, stud2; 定义了两个struct stud类 型的变量stud1,stud2。
2.在定义共用类型的同时说明共用体变量。 例如:
union tag { int bh; float jg; char xm; }data1,data2;
定义了两个union tag类型的变量data1,data2。 这种形式的说明的一般形式为: union 共用体类型名
{ 成员表列
}变量名表列;
3.直接说明共用变量。 例如:
第9章 结 构 体
第9章 结 构 体
任务:学生信息的管理 有一个结构体数组stu[5],每个元素都含有学号、姓名、三门课成绩,要 求编写input()和output()函数,分别实现输入和输出5个学生的数据记录。
任务所需主要相关知识: 结构体类型 结构体变量 结构体数组 结构体指针
9.1 结构体概述
一种构造数据类型——“结构(structure)”或叫“结构 体”。“结构”是一种构造类型,它是由若干“成员”组成 的。每一个成员可以是一个基本数据类型或者又是一个构造 类型。
定义一个结构的一般形式为:
struct 结名 {成员表列};
说明: 1.struct是定义结构体类型的关键字,结构名由编程者按 C语言标识符命名规则指定。 2.最后一个花括号外的分号不能省略。 3.成员表列由若干个成员组成,每个成员都是该结构的 一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名;
9.4 动态存储分配
3.释放内存空间函数free 调用形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr是一个任意类 型的指针变量,它指向被释放区域的首地址。被释放区应是 由malloc或calloc函数所分配的区域。
9.5 链表的概念
每一次分配一块空间可用来存放一个学生的数据,我们可 称之为一个结点 。
{101,"Li ping",'M',45}, {102,"Zhang ping",'M',62.5}, {103,"He fang",'F',92.5}, {104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58}, };
【例9.7】计算一组学生的平均成绩和不 及格人数。
9.1.1 结构类型变量的说明
例如: #define STU struct stud STU
{ int num; char name[20]; char sex; float score;
}; STU stud1, stud2;STU与struct stud等价。
9.1.1 结构类型变量的说明
2.在定义结构类型的同 时说明结构变量
9.1.4 结构变量的初始化
和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。 【例9.2】对结构变量初始化。 【程序代码】 #include <stdio.h> void main() {
struct stud /*定义结构*/ {
int num; char *name; char sex; float score; } stud1, stud2={102,"Zhang ping",'M',78.5}; stud1= stud2; printf("Number=%d\nName=%s\n", stud1.num, ); printf("Sex=%c\nScore=%f\n", stud1.sex, stud1.score); }
void main() {
struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); }
【例9.7】计算一组学生的平均成绩和不 及格人数。
void ave(struct stu *ps) {
int c=0,i; float ave,s=0; for(i=0;i<5;i++,ps++)
9.6 共用体类型
共用体又称联合体,是一种类似于结构体的构造型数据结 构,它准许不同类型和不同长度的数据共享同一块存储空间。 共用体实质上采用了覆盖技术,在程序设计中,采用共用体 要比采用结构体节省空间,但共用体的访问速度比结构体慢。