C语言一日一学第11课——结构体与共用体(3)

合集下载

计算机二级C语言考点:结构体和共用体

计算机二级C语言考点:结构体和共用体

计算机二级C语言考点:结构体和共用体计算机二级C语言考点:结构体和共用体C语言是一门通用计算机编程语言,应用广泛。

以下就是店铺分享计算机二级C语言考点结构体和共用体,希望对大家有帮助!【考点1】结构体类型的说明结构体是若干个类型数据的集合,结构体类型说明格式:struct 类型名 {类型1 成员名1;类型2 成员名2;……};,以上整个部分是一个数据类型,与整型的int是同样地位。

可用typedef把结构体类型替换成一个只有几个字母的简短标识符。

【考点2】结构体变量的定义结构体变量是用说明的结构体类型所定义的一个变量,与结构体类型不是一回事。

一个结构体变量所占字节数为其所有成员所占字节数之和。

如struct stu{char name[10];int age;} a,b;则表明定义了两个结构体变量a,b,每个变量占14个字节。

a,b与int i,j;中的变量i,j是同样地位。

typedef 考的'很多(教材150页例6)。

【考点3】结构体成员的引用引用成员可用以下3种方式:(1)结构体变量名.成员名;(2)指针变量名->成员名:(3)(*指针变量名).成员名。

点(.)称为成员运算符,箭头(->)称为结构指向运算符。

【考点4】共用体共用体的使用格式与结构体相似,共用体定义的关键字为union,共用体所占字节数是所有成员中字节数最大的那个。

union TT{ int a;char ch[2];} t1 ;main(){t1.a=0x1234;printf("%x ",t1.ch[0] );printf("%x ",t1.ch[1] );}考点一: sizeof (struct TT) = 2;考点二: TT t1 ; t1.a=0x1234;那么 ch[0]=0x 34; ch[1]=0x12结构体和共用体以及链表要掌握最简单的。

typedef 考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。

C语言常识结构体与联合体

C语言常识结构体与联合体

C语言常识结构体与联合体C语言中的结构体(structure)和联合体(union)是用来组织和管理数据的重要概念。

它们可以用于存储不同数据类型的元素,并且允许以多种方式访问和操作这些元素。

以下将详细介绍结构体和联合体的定义、使用、特点以及它们在C语言中的应用。

一、结构体(Structure)的定义与使用结构体是一种用户自定义的数据类型,它可以由不同的数据类型组成。

通过结构体,我们可以将相关的数据项组合到一起,从而形成一个逻辑上的实体。

结构体的定义格式如下:```struct 结构体名数据类型1成员名1;数据类型2成员名2;…};```其中,结构体名是自定义的标识符,可以用来声明该结构体类型的变量。

成员名是结构体中的数据项名称,数据类型表示成员的数据类型。

结构体的使用可以分为两个步骤:定义结构体类型和声明结构体变量。

定义结构体类型:```struct Personchar name[20];int age;float height;};```声明结构体变量:```struct Person p1; //声明一个Person类型的结构体变量p1```结构体的成员可以通过“结构体变量名.成员名”的形式进行访问和操作。

访问和操作结构体成员的示例:```strcpy(, "Tom"); //使用strcpy函数将字符串"Tom"复制给p1结构体变量的name成员p1.age = 20; //给p1结构体变量的age成员赋值为20p1.height = 1.8; //给p1结构体变量的height成员赋值为1.8```二、结构体的特点1.结构体可以由不同类型的数据组成,可以灵活地根据需求定义。

2.结构体的成员在内存中是按照定义的顺序依次存放的,可以通过成员名访问对应位置的数据。

3.可以将结构体作为函数的参数和返回值,方便传递和处理复杂的数据结构。

4. 可以通过sizeof运算符来获取结构体的大小。

C语言教程之结构体共用体与位运算

C语言教程之结构体共用体与位运算

C语言教程之结构体共用体与位运算C语言是一种功能强大的编程语言,它提供了许多用于处理复杂数据类型的特性。

其中,结构体、共用体和位运算是三个重要的特性,可以帮助开发者更高效地处理数据。

本教程将介绍C语言中的结构体、共用体和位运算,并给出一些实例和使用场景。

1. 结构体(Structures)结构体是C语言中一种用户自定义的数据类型,可以将不同类型的数据组合在一起,形成一个新的复合数据类型。

结构体通过关键字"struct"来定义,可以在其中定义多个成员变量,并且可以根据需要为每个成员变量指定不同的数据类型。

例如,我们可以定义一个结构体来表示一个学生的信息:```struct studentchar name[20];int age;float grade;};```上面的代码定义了一个名为`student`的结构体,包含了三个成员变量:`name`,`age`和`grade`,分别表示学生的姓名、年龄和成绩。

使用结构体时,可以通过`.`操作符来访问结构体的成员变量,就像访问一个普通的变量一样。

例如,我们可以通过以下方式给结构体的成员变量赋值:```struct student stu1;strcpy(, "John");stu1.age = 18;stu1.grade = 90.5;```2. 共用体(Unions)共用体是C语言中一种特殊的数据类型,它和结构体类似,也可以包含多个成员变量,不同之处在于,共用体的成员变量共享同一块内存空间。

即,共用体的所有成员变量在内存中的起始地址是相同的,它们共同占用一段连续的内存空间。

共用体的定义方式与结构体类似,只是将关键字"struct"换成了"union"。

例如,我们可以定义一个共用体来表示一个变量的多种不同数据类型的解释:```union dataint i;float f;char str[20];};```上面的代码定义了一个名为`data`的共用体,包含了三个成员变量:`i`,`f`和`str`,分别表示整数、浮点数和字符数组。

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

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

第十一章结构体与共用体一、选择题1.【C】分析:C题目中是使用了typedef struct NODE,那么我们一定要指导tepydef就是替代的意思。

所以是用OLD来替代struct NODE作为结构体的类型。

同时我们要记住这里的NODE是可以省略的。

2.【B】分析:本题是考查结构体的定义。

A选项是我们一定要记住的,C选项中的x、y、z是写在结构体里面,所以它们都是结构体的成员,D选项中我们知道struct ex的组合是结构体的类型,这两个缺一不可。

选项B中的example是结构体变量名,一般在右大括号后面的是结构体变量名。

3.【B】分析:INTEGER p等价于int *p。

所以B是正确的。

INTEGER *q等价于int **q。

4.【C】分析:在本题中TT为结构体名,用关键字typedef对结构体进行说明,CIN一个具体的结构体类型名等价于struct TT, 可以用CIN来直接定义结构体变量,而不用再写struct。

A:答案不能用TT直接定义结构体变量,一般格式为(struct TT 结构体变量名);B:答案概念错误,D:答案CIN不是结构体变量,是一个具体的结构体类型名。

5.【C】分析:本题和第一题类似,也是对结构体定义的typedef的考查,B中ST不是结构体类型了,被NEW替代了,选项D中我们知道NEW是一个结构体类型,所以不是结构体变量,当出现了typedef struct 这样的定义时,在右括号出现的NEW就是结构体类型,不是结构体变量了。

6.【A】分析:由于typedef struct S 是替换的意思,所以本题目中是用T来代替struct S这个结构体类型,所以T的左右等于了struct S的作用了,也就是可以用T来定义结构体变量,如T born 中的born就是结构体变量。

当然,struct S就失去了原来的作用,不可以用来作结构体类型了。

7.【C】分析:考查的是结构体变量的赋值,data是一个结构体变量,data是用两个域的,一个是a,一个是b。

C语言结构体与共同体

C语言结构体与共同体

C语言结构体与共同体C语言中结构体和共同体是两种用于组织和管理数据的重要概念。

它们可以帮助程序员更有效地管理和操作数据,提高程序的可读性和可维护性。

一、结构体(Structures)结构体是一种由不同类型的数据成员组成的数据类型,它允许程序员将不同类型的数据组织在一起并使用一个名称来引用它们。

结构体可以包含各种数据类型,例如整数、字符、数组或甚至其他结构体。

结构体的定义通过使用关键字struct来实现。

例如,下面的代码定义了一个名为Person的结构体,其中包含姓名、年龄和性别这三个成员:```cstruct Personchar name[50];int age;char gender[10];};```结构体定义可以在程序的任何地方,通常在函数外部定义,使得它在整个程序中都可见。

结构体的创建和初始化可以使用以下格式:```cstruct Person p1; // 创建名为p1的结构体变量struct Person p2 = {"John", 25, "Male"}; // 创建名为p2的结构体变量并初始化其成员```结构体成员可以通过`.`操作符来访问,例如:```cprintf("Name: %s\n", );```结构体可以作为函数的参数传递,也可以作为函数的返回值。

通过传递结构体作为参数,可以避免传递多个参数,提供了一种有效地传递多个相关数据的方法。

例如,下面的代码演示了一个函数,该函数接受一个名为p的Person结构体作为参数,并打印出其成员的值:```cvoid printPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);printf("Gender: %s\n", p.gender);```二、共同体(Unions)共同体是一种特殊类型的结构体,它允许不同类型的成员共享同一块内存空间。

C语言中的结构体和共用体(联合体)

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语言编程:第十一章结构体与共用体

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语言中的结构体及共用体

C语言中的结构体及共用体

C语⾔中的结构体及共⽤体C语⾔中的结构体、共⽤体以及枚举类型⼀、结构体1、概述 为什么需要结构体? 在实际问题中,⼀组数据可能包含多种数据类型,⽐如描述⼀名学⽣时,需要⽤char类型的姓名,char或者int数据类型的学号,float类型的分数,等等, 结构体可以有效的解决这类问题。

实质 结构体本质上还是⼀种数据类型,它包含若⼲个“成员”,每个成员可以是不同数据类型的,基本数据类型或者构造数据类型。

结构体有利于程序的阅读 理解和移植,⽽且结构体的存储⽅式可以提⾼CPU对内存的访问速度。

定义结构体的⼀般形式: struct 结构名 { 成员列表 }; 成员列表由若⼲个成员组成,都是该结构体的组成部分,对于每个成员都需要进⾏类型说明,其形式为:类型说明符成员名2、定义结构体变量 (1)先声明结构体类型再定义变量名 struct student student1,student2; (2)在声明结构体类型时同时定义变量 这种形式的定义的⼀般形式为: struct 结构体名 { 成员列表 }变量名表列; (3)直接定义结构体类型变量 ⼀般形式为 struct { 成员表列 }变量名表列; //结构体名是可有可⽆的3、结构体变量的引⽤ ##注意: (1)不能将⼀个结构体变量作为⼀个整体进⾏输⼊输出。

(2)如果成员本⾝也是⼀个结构体类型,则需要使⽤成员运算符⼀级⼀级地找到最低⼀级的成员。

(3)结构体变量的成员⼀样可以像普通变量进⾏各种运算。

引⽤结构体变量中的成员的⽅式为: 结构体变量名.成员名 由上⾯形式可以直接对结构体变量中的成员进⾏赋值。

4、结构体变量的初始化 struct 结构体名 { 成员表列 }结构体变量1,结构体变量2 = {...}; 结构体变量1 = {... };5、结构体数组 概念:即数组的每个元素都是结构体类型。

struct 结构体名 { 成员表列 }数组名[]; 或者struct 结构体名数组名[] ; 初始化:数组名[] = { ...};6、指向结构体类型数据的指针 概念:结构体变量的指针就是该结构体变量所占据的内存段的起始地址。

C语言第11讲--结构体和共用体

C语言第11讲--结构体和共用体
num a[0] a[1] a[2] name(20) score(4)
如:方式(2) 方式 struct student int score[4];}
{long num;char name[20];
结构体数组初始化
a[3]={{20030001,"zhang",89,90,91,92}, {20030002,"liu",68,69,70,71}, {20030003,"li",57,58,59,60} };
第十三讲 特殊数据类型
—— 结构体、共用体、 结构体、共用体、 枚举类型、 枚举类型、自定义类型
§11.1 结构体和共用体概述
数组可以存放一组相关的同类型数据, 数组可以存放一组相关的同类型数据,但是 一组相关的同类型数据 不能将不同类型的数据放入同一数组中。 不能将不同类型的数据放入同一数组中。 如果需要把一个学生的学号、姓名、性别、 如果需要把一个学生的学号、姓名、性别、 年龄、各门功课的考试成绩等不同类型的数 年龄、各门功课的考试成绩等不同类型的数 放在一个构造型数据类型中, 据放在一个构造型数据类型中,就需要另外 一种新的数据类型: 一种新的数据类型:结构体类型或者共用体 类型数据 数据。 类型数据。 一个结构体类型的变量中可以独立存放多种 类型的数据,一个共用体 共用体类型的变量中可以 类型的数据,一个共用体类型的变量中可以 共用同一段存储单元来存放不同类型的数据 来存放不同类型的数据。 共用同一段存储单元来存放不同类型的数据。
4
三、对结构体类型的说明
结构体类型与结构体类型变量是两个概念, 结构体类型与结构体类型变量是两个概念, 应区分结构体名与变量名。 应区分结构体名与变量名。 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。

C语言一日一学第11课——结构体与共用体(3)

C语言一日一学第11课——结构体与共用体(3)

[课程]C语言一日一学第11课——结构体与共用体(3)11.8 共用体11.8.1共用体的概念使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构.定义共用体类型变量的一般形式为:Code:union共用体名{成员表列}变量表列;例如:Code:union data union data{ {int i; int i;char ch;或 char ch;float f; float f;}a,b,c; };union data a,b,c;共用体和结构体的比较:结构体变量所占内存长度是各成员占的内存长度之和。

每个成员分别占有其自己的内存单元。

共用体变量所占的内存长度等于最长的成员的长度。

例如:上面定义的“共用体”变量a、b、c各占4个字节(因为一个实型变量占4个字节),而不是各占2+1+4=7个字节。

11.8.2 共用体变量的引用方式只有先定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。

例如:前面定义了a、b、c为共用体变量a.i (引用共用体变量中的整型变量i)a.ch(引用共用体变量中的字符变量ch)a.f (引用共用体变量中的实型变量f)11.8.3 共用体类型数据的特点(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。

(3) 共用体变量的地址和它的各成员的地址都是同一地址。

(4) 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。

(5) 不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(6) 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。

反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

C语言学习入门笔记之结构体与共用体

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语言11结构体与共用体

C语言11结构体与共用体

struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)

C语言 结构体和共用体

C语言 结构体和共用体

结构体和共用体【问题】表格数据在C语言中怎么处理?一、结构体(其成员“有限、有序、可以不同类”)1、类型定义及结构体变量定义struct 类型名{类型名1 变量序列1;类型名2 变量序列2;类型名3 变量序列3;……};2、说明(1)实例:以上表格对应的结构体类型定义:struct STU{char name[20];char sex;int age;float score;};假设某班最多30人,则可以用此类型名定义数组:struct STU a[30];(2)独立定义结构体类型名时,最后的分号不可以省。

(3)可以将结构体类型与结构体类型的变量一起定义,此时“类型名”可以省。

struct STU{char name[20];char sex;int age;float score;} a[30];或struct{char name[20];char sex;int age;float score;} a[30];(4)结构体类型的变量一般不可以整体引用,通常应该引用其每一个成员(相当于同类型的普通变量)(5)同类型的结构体变量之间可以整体赋值。

除此之外,不可以整体引用。

(6)结构体变量成员的表示:结构体变量名.成员名其中“.”是成员运算符,优先级最高。

2、结构体变量的获值(1)初始化struct STU x={“Zhangsan”, …m‟, 19, 550.5}; (2)定义之后获值①赋值语句struct STU x;strcpy(, “Zhangsan”); x.sex=‟m‟;x.age=19;x.score=550.5;②输入语句struct STU x;gets();scanf(“%c%d%f”,&x.sex,&x.age,&x.score); 【注意:结构体变量所占内存空间的大小是其所有成员所占空间之和。

】3、结构体的引入就是为了处理表格数据,因此通常定义成结构体数组。

c语言第11章-结构体与共用体

c语言第11章-结构体与共用体

}
§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

C++课件:第11章结构体与共用体

C++课件:第11章结构体与共用体
person={“li li”,’f’, 24, “primary”,1000}; 错!
C++课件:第11章结构体与共用体
例11.2 定义一个结构体类型,包含通讯录中的如下信息: 姓名、年龄、电话、通讯地址;并定义该类型的变量, 输入数据并输出。
程序l11_2.c
#include "stdio.h" struct address_list {char name[10];
/*{}内是该类型的各成员*/
char sex;
int age;
char position[10];
float salary; };
/*语句末尾是“;” */
该结构体类型名为struct teacher,teacher 是该结构体的标识符; 该类型包含有6个成员的数据项:name、 sex、 age、 position 和salary,其中每个成员项都有自己的类型。
}; struct teacher person; /*定义结构体变量person*/
strcpy(,"wang li");
person.sex=‘f’;
/*给各成员赋值*/
person.age=30;
strcpy(person.position,"middle");
person.salary=1600;
C++第11章结构体与共用体
C++课件:第11章结构体与共用体
1、结构体类型的定义 2、结构体变量的定义及引用 3、结构体数组 4、结构体类型的指针 5、链表的基本操作 6、共用体和枚举类型(了解)
C++课件:第11章结构体与共用体

C语言:结构体和联合体(共用体)

C语言:结构体和联合体(共用体)

C语⾔:结构体和联合体(共⽤体)
结构体:struct
1、结构体变量的⾸地址能够被其最宽基本类型成员的⼤⼩所整除。

2、结构体每个成员相对于结构体⾸地址的偏移量(offset)都是成员的整数倍。

3、结构体的总⼤⼩为结构体最宽基本类型成员⼤⼩的整数倍。

cpu的字长:
32位的cpu或64位的cpu
32位或64位指的是cpu的字长
字长实际上指得是cpu在访问内存时,⼀次可以读取的长度。

内存对齐(可以设置,⼀般是2的倍数,虽然浪费了空间,但是⽅便了cpu更好更快的取出数据):
char 4个字节
int 4个字节
int 8个字节
double 8个字节
联合体(共⽤体):union
1、所有的属性成员都共同相同的⼀块内存空间,⽽这个空间⼤⼩取⾃最⼤属性成员的⼤⼩。

属性成员在依次存值时,会产⽣覆盖。

2、联合变量的定义和初始化,使⽤第⼀个数据成员做初始化,{}不能省略。

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

[课程]C语言一日一学第11课——结构体与共用体(3)11.8 共用体11.8.1共用体的概念使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构.定义共用体类型变量的一般形式为:Code:union共用体名{成员表列}变量表列;例如:Code:union data union data{ {int i; int i;char ch;或 char ch;float f; float f;}a,b,c; };union data a,b,c;共用体和结构体的比较:结构体变量所占内存长度是各成员占的内存长度之和。

每个成员分别占有其自己的内存单元。

共用体变量所占的内存长度等于最长的成员的长度。

例如:上面定义的“共用体”变量a、b、c各占4个字节(因为一个实型变量占4个字节),而不是各占2+1+4=7个字节。

11.8.2 共用体变量的引用方式只有先定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。

例如:前面定义了a、b、c为共用体变量a.i (引用共用体变量中的整型变量i)a.ch(引用共用体变量中的字符变量ch)a.f (引用共用体变量中的实型变量f)11.8.3 共用体类型数据的特点(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。

(3) 共用体变量的地址和它的各成员的地址都是同一地址。

(4) 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。

(5) 不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(6) 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。

反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

例11.12 设有若干个人员的数据,其中有学生和教师。

学生的数据中包括:姓名、号码、性别、职业、班级。

教师的数据包括:姓名、号码、性别、职业、职务。

可以看出,学生和教师所包含的数据是不同的。

现要求把它们放在同一表格中。

Code:#include <stdio.h>struct{int num;char name[10];char sex;char job;union{int banji;char position[10];}category;}person[2];/*先设人数为2*/void main(){int i;for(i=0;i<2;i++){scanf("%d %s %c %c", &person[i].num, &person[i].name,&person[i].sex, &person[i].job);if(person[i].job == 'S')scanf("%d", &person[i].category.banji);elseif(person[i].job == 'T')scanf("%s", person[i].category.position);else printf(“Input error!”);}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].na me, person[i].sex, person[i].job, person[i].category.banji);else printf(“%-6d%-10s%-3c%-3c%-6s\n”,person[i].num,person[i].name,person[i].sex, person[i].job, person[i].category.position); }}运行情况如下:Code:101Lifs501WangmtprofessorNo.Namesexjobclass/position101Lifs501102Wangmtprofessor13.9 枚举类型枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

申明枚举类型用enumCode:enum weekday{sun,mon,tue,wed,thu,fri,sat};定义变量:Code:enum weekday workday,week-day;enum{sun,mon,tue,wed,thu,fri,sat}workday;变量值只能是sun到sat之一说明:(1)在C编译中,对枚举元素按常量处理,故称枚举常量。

它们不是变量,不能对它们赋值。

(2) 枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2…(3) 枚举值可以用来作判断比较。

(4) 一个整数不能直接赋给一个枚举变量。

算法:Code:#include <stdio.h>main(){enum color {red,yellow,blue,white,black};enum color i,j,k,pri; int n,loop;n=0;for (i=red;i<=black;i++)for (j=red;j<=black;j++)if (i!=j){for (k=red;k<=black;k++)if ((k!=i) && (k!=j)){n=n+1;printf("%-4d",n);for (loop=1;loop<=3;loop++){switch (loop){case 1: pri=i;break;case 2: pri=j;break;case 3: pri=k;break;default:break;}switch (pri){case red:printf("%-10s","red");break;case yellow: printf("%-10s","yellow"); break;case blue: printf("%-10s","blue");break;case white: printf("%-10s","white");break;case black: printf("%-10s","black");break;default :break;}}}printf("\n");}printf("\ntotal:%5d\n",n);}运行情况如下:1redyellowblue2redyellowwhite3redyellowblack58blackwhitered59blackwhiteyellow60blackwhiteblue total:6013.10 用typedef定义类型用typedef声明新的类型名来代替已有的类型名声明INTEGER为整型Code:typedef int INTEGER声明结构类型Code:Typedef struct{int month;int day;int year;}DATE;声明NUM为整型数组类型Code:typedefintNUM[100];声明STRING为字符指针类型Code:typedef char *STRING;声明POINTER为指向函数的指针类型,该函数返回整型值Code:typedef int (*POINTER)()用typedef定义类型的方法①先按定义变量的方法写出定义体(如:int i)。

②将变量名换成新类型名(例如:将i换成COUNT)。

③在最前面加typedef(例如:typedef int COUNT)。

④然后可以用新类型名去定义变量。

用typedef定义类型的方法(举例)①先按定义数组变量形式书写:int n[100];②将变量名n换成自己指定的类型名:int NUM[100];③在前面加上typedef,得到typedef int NUM[100];④用来定义变量:NUMn;说明:(1) 用typedef可以声明各种类型名,但不能用来定义变量。

(2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。

(3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。

(4) 使用typedef有利于程序的通用与移植。

(5) typedef与#define有相似之处,例如:typedef int COUNT;#define COUNT int的作用都是用COUNT代表int。

但事实上,它们二者是不同的。

#define是在预编译时处理的,它只能作简单的字符串替换,而typedef是在编译时处理的。

实际上它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型作业:1.有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)2.编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录,再编写一个函数input,用来输入5个学生的数据记录。

C语言学习大纲/forum/view_124110.html2009-7-8 2:29:29∙紫凤凰∙∙∙等级: 钻石VIP∙威望: 0∙发贴: 23 贴∙货币: 0金币∙积分: 3339 分∙经验: 140 点∙体力: 15505 点∙注册: 2006-04-28#2Re:[课程]C语言一日一学第11课——结构体与共用体(3)一题:#include <stdio.h>struct student {char num[6];char name[8];int score[4];float avr;} stu[10];void main() {int i, j, max, maxi, sum;float average;for(i=0; i<10; i++) {printf("\n 请输入学生%d 的成绩:\n", i+1);printf("学号: ");scanf("%s", stu[i].num);printf("姓名: ");scanf("%s", stu[i].name);for(j=0; j<3; j++) {printf("成绩%d:", j+1);scanf("%d", &stu[i].score[j]);}average = 0;max = 0;maxi = 0;for(i=0; i<10; i++) {sum = 0;for(j=0; j<3; j++)sum += stu[i].score[j];stu[i].avr = sum/3.0;average += stu[i].avr;if(sum > max) {}}average /= 10;printf(" 学号姓名成绩1 成绩2 成绩3 平均分for(i=0; i<10; i++) {printf("%6s%7s", stu[i].num, stu[i].name);for(j=0; j<3; j++) printf("%8d", stu[i].score[j]);printf(" %6.2f\n", stu[i].avr);}printf("平均成绩是%5.2f\n", average);printf("最好成绩是学生%s, 总分是%d.\n",:char num[6];char name[8];int score[3];float avr;for(i=0; i<10; i++) {printf("\n 请输入学生%d 的成绩:\n", i+1);printf("学号: ");scanf("%s", stu[i].num);printf("姓名: ");scanf("%s", stu[i].name);for(j=0; j<3; j++) {printf("成绩%d:", j+1);scanf("%d", &stu[i].score[j]);}}print();printf("\n");int i, j;printf(" 学号姓名成绩1 成绩2 成绩3"); for(i=0; i<10; i++) {printf("\n%6s%7s", stu[i].num, stu[i].name);for(j=0; j<3; j++) printf("%8d", stu[i].score[j]); }编译通过。

相关文档
最新文档