第14章 结构体、共用体、枚举和typedef
结构体typedef用法
结构体typedef用法结构体typedef用法在C语言中,结构体作为一种自定义数据类型,可以存储多个不同类型的数据。
但是使用结构体时需要为它们定义名称和声明变量,并通过"."来访问结构体的元素,这些操作比较繁琐。
此时,typedef就可以为我们提供方便。
typedef的作用typedef可以将一个结构体定义的别名,从而使结构体的使用更为方便快捷。
其基本语法如下:typedef struct{类型名成员名1;类型名成员名2;······}别名;typedef常用的形式有两种:一种是定义一个结构体:typedef struct student{char name[20];int age;float score;}STUDENT;另一种是定义一个指针:typedef struct student *STU;使用typedef定义别名后,我们就可以直接使用别名来声明结构体的变量了,例如:STUDENT stu1;STU stu2;此时,我们可以通过"."来访问结构体中的元素:strcpy(, "Tom");stu1.age = 18;stu1.score = 89.5;而使用指针类型时,我们则需要使用"->"来访问:STU stu3 = (STU)malloc(sizeof(struct student));strcpy(stu3->name, "Lucy");stu3->age = 19;stu3->score = 91.5;typedef还可以与枚举类型或其他类型一起使用,例如:typedef enum status{SUCCESS,FAILURE,ERROR}Status;此时我们就可以使用Status来代表枚举类型status。
2级C语言第14章 结构体共用体和用户定义类型
例 struct student { int num; char name[20]; char sex; } stu1[2]={{112,“Wang Lin”,„M‟},{19, “Li Jia”, „W‟};
struct 形式三: { 类型标识符 成员名; 类型标识符 成员名; ……………. 不管那种赋值,不允许跳过前面的成员给后 }结构体变量={初始数据}; 面的成员赋值,但可以只给前面的成员赋值
例 ,后面未赋值的数值数据按0处理,字符数据 struct { int num; 按‘\0‟,字符串数据按空串处理。 char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,„M‟,19, “200 Beijing Road”};
二、 结构体变量的定义
1. 先定义结构体类型,再定义结构体变量 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2; STU stu1,stu2; #define STU struct student STU { int num; char name[20]; char sex; int age; float score; char addr[30]; };
2. 定义结构体类型的同时定义结构体变量
struct student struct
{ int num;
{ int num; 用无名结构体直接定义 char name[20]; char name[20]; 变量只能一次 char sex; char sex; int age; int age; float score; float score; char addr[30]; char addr[30]; }stu1,stu2; } stu1,stu2;
C语言typedef用法总结
C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。
当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。
定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。
2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。
typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。
3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。
typedef是由编译器解释的。
▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。
4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。
5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。
如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。
台州学院C语言程序设计课件——结构体
例: struct Grade_Info { int score; struct Grade_Info *next; }; typedef struct Grade_Info NODE; NODE;
2、线性链表的基本操作 基本操作有:创建、插入、删除、输出和销毁等 基本操作有:创建、插入、删除、输出和销毁等。 链表的创建操作 含义:从无到有地建立起一个链表, 含义:从无到有地建立起一个链表,即往空链表中依次 插入若干结点,并保持结点之间的前驱和后继关系。 插入若干结点,并保持结点之间的前驱和后继关系。 基本思想:首先创建一个头节点,让头指针head和尾指 基本思想:首先创建一个头节点,让头指针head和尾指 tail都指向该节点 并设置该节点的指针域为NULL( 都指向该节点, 针tail都指向该节点,并设置该节点的指针域为NULL(链尾 标志);然后为实际数据创建一个节点,用指针pnew指向它 );然后为实际数据创建一个节点 指向它, 标志);然后为实际数据创建一个节点,用指针pnew指向它, 并将实际数据放在该节点的数据域,其指针域置为NULL; 并将实际数据放在该节点的数据域,其指针域置为NULL;最 后将该节点插入到tail所指向节点的后面 同时使tail指向 所指向节点的后面, 后将该节点插入到tail所指向节点的后面,同时使tail指向 pnew所指向的节点 pnew所指向的节点。 所指向的节点。
以分号; 以分号;结尾
//学号 //学号 //姓名 //姓名 //性别 //性别 //年龄 //年龄 //班级 //班级 //成绩 //成绩
例 2: struct Date { int year; //年 //年 int month; //月 //月 int day; //日 //日 };
2、结构体变量的定义和引用 结构体变量的定义 间接定义法:先定义结构类型,再定义结构变量 间接定义法:先定义结构类型,
IOS开发基础-枚举及typedef
【C语言】22-枚举本文目录∙一、枚举的概念∙二、枚举类型的定义∙三、枚举变量的定义∙四、枚举使用的注意∙五、枚举变量的基本操作说明:这个C语言专题,是学习iOS开发的前奏。
也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。
如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略上一讲介绍了结构体类型,这讲就介绍C语言中的另一种数据类型---枚举类型。
枚举类型在iOS中也是很常用的,用法跟Java中的枚举类似。
回到顶部一、枚举的概念枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。
当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。
比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。
回到顶部二、枚举类型的定义一般形式为:enum枚举名{枚举元素1,枚举元素2,……};enum Season {spring, summer, autumn, winter};回到顶部三、枚举变量的定义前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量。
跟结构体一样,有3种方式定义枚举变量1.先定义枚举类型,再定义枚举变量enum Season {spring, summer, autumn, winter};enum Season s;2.定义枚举类型的同时定义枚举变量enum Season {spring, summer, autumn, winter} s;3.省略枚举名称,直接定义枚举变量enum {spring, summer, autumn, winter} s;上面三种方式定义的都是枚举变量s回到顶部四、枚举使用的注意1> C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。
2> 枚举元素的值取决于定义时各枚举元素排列的先后顺序。
默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。
c语言typedef语法格式
C语言typedef语法格式1. 介绍C语言是一种广泛应用的编程语言,它具有强大的功能和灵活的语法结构。
在C语言中,typedef是一种非常重要的关键字,它可以用来为已有的数据类型定义一个新的名字,这样可以增加代码的可读性和易用性。
本文将对C语言typedef的语法格式进行详细介绍,帮助读者更好地理解并应用typedef关键字。
2. typedef的基本语法在C语言中,使用typedef关键字可以为已有的数据类型定义一个新的名字。
其基本语法格式如下:```ctypedef 已有的数据类型新的数据类型名;```其中,已有的数据类型可以是基本的数据类型,也可以是自定义的结构体、共用体或枚举类型。
新的数据类型名可以是任何合法的标识符,用来代表已有数据类型的别名。
3. typedef关键字的作用通过使用typedef关键字,可以为已有的数据类型定义一个新的名字,这样可以使代码更加清晰易懂。
typedef还可以简化复杂数据类型的声明,提高代码的可维护性和可读性。
typedef还可以帮助程序员更好地进行数据类型的抽象和封装,使代码更加模块化和独立。
4. typedef与数据类型的关系在C语言中,typedef关键字和已有的数据类型之间存在着紧密的关系。
通过typedef,可以为已有的数据类型定义一个新的名字,从而使得程序中可以使用这个新的名字来表示已有的数据类型。
这样可以提高代码的可读性和易用性,减少相同数据类型的重复声明,使代码更加简洁和清晰。
5. typedef的使用方法在C语言中,使用typedef关键字可以有多种不同的方法。
可以使用typedef来定义结构体的新名字,以及为指针类型定义新名字。
下面分别介绍这两种常见的使用方法:5.1 定义结构体的新名字结构体是C语言中一种重要的数据类型,它可以用来表示复杂的数据结构。
通过使用typedef,可以为结构体定义一个新的名字,从而简化结构体的声明和使用。
其基本语法格式如下:```ctypedef struct 原结构体名新结构体名;```通过这种方式,就可以为原结构体定义一个新的名字,以便在程序中使用新的名字表示该结构体类型。
结构体与共用体
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语言结构体定义+typedef
c语言结构体定义+typedefC语言是一种高级编程语言,它为程序员提供了一种灵活且强大的工具,用于开发各种类型的软件应用程序。
在C语言中,结构体是一种非常重要的数据类型,它允许程序员将不同类型的数据组合在一起,以便更方便地进行管理和操作。
结构体是一种能够将多个不同类型的数据组织在一起的数据结构,它能够帮助程序员组织和管理变量,使得程序更加清晰易懂。
在C语言中,我们可以使用关键字"struct"来定义一个结构体,然后在结构体中定义多个成员变量,每个成员变量可以是不同的数据类型。
下面是一个简单的C语言结构体定义的例子:```cstruct Student {int id;char name[20];int age;float score;};```在这个例子中,我们定义了一个名为"Student"的结构体,它包含了学生的学号、姓名、年龄和分数这四个成员变量,分别为整型、字符数组、整型和浮点数类型。
通过定义这个结构体,我们可以使用它来创建多个学生对象,并且可以方便地管理和操作这些学生对象的数据。
除了使用关键字"struct"来定义结构体之外,C语言还提供了"typedef"关键字,可以用它来为结构体定义一个新的类型名称。
下面是一个使用"typedef"定义结构体类型名称的例子:```ctypedef struct {int year;int month;int day;} Date;```在这个例子中,我们使用"typedef"关键字为一个匿名的结构体定义了一个名为"Date"的新类型名称。
这个结构体表示日期,包含了年、月和日这三个成员变量,它可以方便地用来表示日期数据。
结构体和"typedef"是C语言中非常重要的概念,它们可以帮助程序员更加灵活地使用用户自定义的数据类型,将不同类型的数据组合在一起,更清晰地表示数据结构,提高代码的可读性和可维护性。
c语言结构体定义typedef
c语言结构体定义typedefC语言结构体定义typedefC语言是一种非常流行的编程语言,广泛应用于嵌入式系统、操作系统以及各种应用程序的开发中。
在C语言中,结构体是一种非常重要的数据类型,它允许我们将不同的数据类型组合在一起,形成一个新的数据类型。
为了方便使用结构体,C语言提供了typedef关键字,使我们能够为结构体定义一个新的名称。
那么,下面就让我们一步一步地探讨typedef在C语言结构体定义中的作用和使用方法。
第一步:了解结构体的基本概念在开始使用typedef关键字定义结构体之前,我们首先需要了解结构体的基本概念。
结构体是由多个不同数据类型的变量组成的复合数据类型。
它允许我们将不同类型的数据组合在一起,形成一个整体,方便我们对这些数据进行统一管理和操作。
结构体的定义由关键字"struct"开始,后面跟着结构体的名称,再加上一对大括号,用于定义结构体的成员变量。
例如,我们可以定义一个包含学生信息的结构体如下:cstruct Student {int id;char name[20];int age;};上面的代码定义了一个名为Student的结构体,它包含了一个整型变量id、一个字符数组name和一个整型变量age。
第二步:使用typedef为结构体定义新的名称在上面的代码中,我们可以看到结构体的定义必须以struct关键字开头。
当我们想要使用这个结构体类型时,需要每次都写上struct关键字,这样显得比较冗长。
为了简化代码,C语言提供了typedef关键字,使我们能够为结构体定义一个新的名称。
使用typedef的语法如下:ctypedef struct {int id;char name[20];int age;} Student;在上面的代码中,我们使用typedef关键字为结构体定义了一个新的名为Student的名称。
这样,我们就可以直接使用Student作为结构体类型,而无需每次都写上struct关键字了。
C语言知识总结——宏,枚举,结构体,共用体
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
c语言结构体 枚举
c语言结构体枚举在C语言中,结构体(struct)和枚举(enum)是用于组织和管理数据的两种重要的复合数据类型。
下面分别介绍结构体和枚举的基本概念和用法:结构体(struct):结构体是一种用户自定义的数据类型,允许将不同类型的数据组合成一个单一的实体,以便更好地表示和处理复杂的数据结构。
定义结构体:c复制代码struct Person {char name[50];int age;float height;};结构体的初始化:c复制代码struct Person person1 = {"John", 25, 175.5};访问结构体成员:c复制代码printf("Name: %s\n", );printf("Age: %d\n", person1.age);printf("Height: %.2f\n", person1.height);枚举(enum):枚举是一种用于定义符号常量的用户自定义数据类型,它为一组相关的整数值提供了有意义的名字。
定义枚举:c复制代码enum Weekday {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};默认情况下,Monday 的值为0,Tuesday 的值为1,以此类推。
使用枚举:c复制代码enum Weekday today = Wednesday;printf("Today is %d\n", today); // 输出: 2修改枚举常量的值:c复制代码enum Weekday {Monday = 1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};在这个例子中,Monday 的值为1,Tuesday 的值为2,以此类推。
结构体和枚举是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语言学习指南课件与历年真题精讲精析 第14章
二级C语言程序设计 学习指南与历年真题精讲精析
第14章 结构体、共用体和用户定义 类型
C语言中可由用户构造的两种数据类型:
1、结构体(struct)
2、共用体(union)
14.1 用typedef说明一种新类型名 1、C语言允许用typedef说明一种新类型名: typedef 类型名 标识符; 2、“类型名”必须是在此语句之前已有定义的类型标 识符,“标识符”是一个用户定义标识符,用作新的 类型名。typedef语句的作用仅仅是用“标识符”来
struct dent*s=&s[0]
则以下表达式中值为2的是_____。 (&s[0])->m s[0].m
B)*(p++)->m
C)(*p).m
*(&s[0])->m
s[0].m
*s[0].m
*&a
a
√
D)*((++p)->m)
*((&s[1])->m)
*s[1].m
*&b
五、函数之间结构体变量的数据传递 1、向函数传递结构体变量的成员 结构体变量中的每个成员可以是简单变量、数组或指针变量 等,作为成员变量,它们可以参与所属类型允许的任何操作。 2、向函数传递结构体变量 结构体变量作实参时,传递给函数对应形参的是它的值,函
}std,pers[3],* pstd; name sex birthday year month day sc[0] sc[1] sc[2] sc[3]
方法2:在说明一个无名结构体类型的同时,直接进行定义: 如:struct { char name[12]; char sex; struct date birthday; float sc[4];
结构体与共用体
一、结构体(structure)
C语言允许用户自己指定这样一种数据结构,即将不同类型的数据组合成一个有机的整体以便于引用。
二、共用体
使几个不同的变量共占同一段内存的结构。
三、枚举类型
1、如果一个变量只有几种可能的值,可以用此方法定义。
2、声明枚举类型用enum开头。
3、说明:(1)在C编译中,对枚举元素按常量处理;
(2)C语言编译按定义时的顺序使它们的值为0,1,2…,也可以改变枚举元素的值,在定义时由程序员指定;
(3)枚举值可以用来作判断比较;
(4)一个整数不能直接赋给一个枚举元素,只有进行强制类型转换才能赋值:workday=(enum weekday)2;
四、用typedef定义类型。
结构体
C语言:结构体、共用体、枚举、类型重定义、位运算、预处理C语言除了提供象int,long,float,double、和char这样的基本数据类型之外,还支持数组、Struct、Union、和Enum数据类型。
结构体类型(struct)我们一个数组包含多个成员(元素),每个成员具有相同的数据类型。
一个结构体也能包含多个成员,但每个成员的数据类型可以不同。
例如:(a) struct Student { char Name[10], char Sex, int Age ;float Height; }(b) struct Student S1;这里,(a)定义了struct类型Student,而(b)定义了S1是Student类型的变量。
Student类型包含四个成员:Name,Sex,Age,Height,它们的数据类型分别是字符数组、字符型、整型、和浮点型。
以下是另一例子:struct DATE { int YEAR; int MONTH, int DAY ;}struct DATE d1,d2;注意,struct类型是泛指,而Student和DATE是两个特定的结构体类型。
当定义一结构体类型时,你要指定它的结构体类型名,当定义变量时,要同时写上关键字struct和结构体类型名。
定义结构体类型:我们struct 结构体类型名 { 成员1;成员2;…;成员n; }每一个成员可以是基本类型的变量、数组或指针变量,也可以是其他结构体或共用体类型的变量、数组或指针。
成员虽然不能是本结构体类型的变量,但可以是本结构体类型的指针变量。
定义结构体类型的变量:struct 结构体类型名变量名1,变量名2,…定义结构体变量时也可初始化,如:struct Student S1,S2={ “Zhang San”, ‟M‟, 19, 1.76 },S3;引用结构体类型的变量:(1)引用其成员:结构体变量名。
成员如 strcpy(,”Li Si”); S1.Sex=‟F‟; S1.Age=18; S1.Height=1.72;[0]=‟L‟; [1]=‟i‟; [2]=‟u‟; [3]=‟\0‟;S2.Height = S1.Height + 0.01 ;(1)引用整体就用变量的名字。
c语言枚举和结构体的区别
c语言枚举和结构体的区别C语言中,枚举(enum)和结构体(struct)是两种不同的数据类型,它们之间有以下区别:1. 枚举是一种常量集合,常用于定义一组相关的常量,例如星期几、月份等,它们都是由一些特定的常量值组成。
枚举常量的值默认从0开始依次递增,可以手动指定枚举值或者改变默认枚举值的起始值。
2. 结构体是一种用户自定义的数据类型,可以将不同类型的变量组合成一个整体,形成一个新的数据类型。
结构体可以包含不同类型的成员变量,每个成员变量可以起一个自定义的名称。
结构体变量的大小等于所有成员变量大小的和。
3. 枚举和结构体在定义和声明方式上有所不同。
枚举类型的定义方式如下:```cenum enumName { a, b, c };```结构体类型的定义方式如下:```cstruct structName {type member1;type member2;...};```4. 在使用枚举和结构体时,访问成员变量的方式也有所不同。
枚举是一组常量的集合,可以直接使用枚举常量进行访问,例如: ```cenum weekDay {Mon, Tue, Wed, Thu, Fri, Sat, Sun};enum weekDay today = Wed;printf('%d', today); // 输出2,表示今天是星期三```结构体变量的成员变量需要使用'点'运算符进行访问,例如: ```cstruct student {char name[20];int age;};struct student s;strcpy(, 'John');s.age = 20;printf('%s %d', , s.age); // 输出John 20```5. 枚举常量值可以在程序中出现多次,且不会造成问题。
但结构体成员变量名必须唯一,否则会编译错误。
6. 枚举常量的值可以是任何整数类型,但结构体成员变量必须是具体的数据类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
14.4.3 字节对齐
• 出于效率的考虑,C语言引入了字节对齐机制,一 般来说,不同的编译器字节对齐机制有所不同, 但还是有以下3条通用准则: • (1)结构体变量的首地址能够被其最宽基本类型 成员的大小所整除; • (2)结构体每个成员相对于结构体首地址的偏移 量(offset)都是成员大小的整数倍,如有需要 编译器会在成员之间加上填充字节(internal adding); • (3)结构体的总大小为结构体最宽基本类型成员 大小的整数倍,如有需要编译器会在最末一个成 员之后加上填充字节(trailing padding)。
14.1 什么是结构体
• 仍以人为例来介绍,要管理姓名、单位、Email地 址、联系电话等信息,现实生活中,很多人采用 名片的形式,将这些信息印在一张卡片上。收集 的一张张名片大大方便了数据的管理,将这种理 念借鉴到C语言程序设计中,是否有类似于名片的 那么一种变量呢? • 有,答案就是“结构体变量”,是一种复合变量, 在进一步说明结构体变量前,先来看“结构体” 的概念,结构体和结构体变量的关系类似与类型 与普通变量的关系,结构体中说明了结构体变量 的信息格式,而结构体变量是结构体的实例。
14.4 结构体和共用体的内存差异
• 结构体变量和共用体变量是两种复合类型的变量, 对C语言内置的基本数据类型,我们都明确知道其 占用的内存空间大小,但结构体变量和共用体变 量占据多大的内存空间呢?两种变量在内存中的 表示形式有何差别?这是本节讨论的问题。
14.4.1 结构体变量和共用体变量内存形式的不同
14.4.4 最宽基本类型
• 字节对齐第3条准则提及最宽基本类型的概念,所谓基本类型是指像char、short、 int、float、double这样的内置数据类型。“数据宽度”就是指其sizeof的大小。诸 如结构体、共用体和数组等都不是基本数据类型,来看一段示例:
14.4.5 共用体的大小
14.2 特殊结构体
• 上一节中讨论的person结构相对简单,只包含了3 个数据成员:name、age和email,如果面对的是 更为复杂的结构,将所有的数据成员并排似乎不 是个高效的方法,那能否使用结构体嵌套,一层 层管理数据呢?
14.2.1 结构体嵌套
• • • • • 顾名思义,结构体嵌套就是“结构体套结构体”,某个结构的数据成员也是一个结构 体变量,这样,可以按层次结构合理组织数据,举例来说: struct student { char name[20]; struct scorestruct /*结构体scorestruct的定义 */ { int math; int English; }score; /*声明结构体变量 score*/ struct infostruct /*结构体 infostruct的定义*/ { float height; float weight; }info; /*声明结构体变量 info*/ };
14.3.4 共用体变量的初始化
• 在声明一个共用体比昂两的同时,可以完成其初始化,与 结构变量的初始化不同的是,只能对共用体变量列表中的 一个变量进行初始化,对前面定义的共用体computerInfo 来说,下列语句是合法的: • computerInfo com1={"Asus X80"}; • computerInfo com1={6000}; • 与结构类似,可以把共用体定义、共用体变量声明及其初 始化放在一起,如: • union computerInfo /*定义一个 共用体computerInfo*/ • { • char typeid[20]; • float price; • }comp1={" Asus X80"};
14.3.3 声明共用体变量
• 和结构体的使用方式一样,定义了共用体后,共 用体名可以看成是一种类型,用其可声明共用体 变量,基本格式为: • union 共用体名 共用体变量; • 在定义共用体的同时也可以完成一个或多个共用 体变量的声明,举例来说: • union computerInfo /* 定义一个共用体computerInfo*/ • { • char typeid[20]; • float price; • }comp1, comp2;
• • • •
• • • • •
•
14.2.2 匿名结构体
• C语言允许定义匿名结构,所谓匿名结构,就是不指定结构 体的名称,但一定要在结构体定义的同时声明至少一个结 构体变量,否则,这种用法没有意义,如: • struct • { • char name[20]; • int age; • }wangwu, lisi; • 这样便声明创建了两个结构体变量wangwu和lisi,可以通 过诸如“”等形式来访问其成员,但这种类型 没有名称,因此无法在以后的程序中声明这种类型的变量。
14.3.2 共用体的定义
• • • • • • • • • • • • • 共用体可采用如下形式定义: union 共用体名称(或称标识) { 存储数据列表(或称成员变量列表) }; 注意,结束花括号后的分号(};)不要遗漏,这种定义形式是一个完整的 C++语句。 举例来说: union computerInfo /*定义一个共用 体computerInfo*/ { char typeid[20]; float price; }; 某个部门要登记所有的电脑,如果是品牌机,就登记型号(typeid),如 果是组装机,就登记价格(price),因此,型号和价格只取其一,这时 使用共用体最为合适。
• 前面以及提到,编译器会为结构体变量中的每个数据成员 分配不同的地址空间,也就是说,结构体变量中的数据程 序是并列关系,而编译器为共用体变量中的数据成员分配 的是同一块内存,每个时刻只有一个数据成员有意义,从 地址的角度来看两者的差异,形象地表明了这一点。
14.4.2 结构体变量的内存大小
• 直观上理解,结构体变量占据的内存单元的个数应当是其内部所 有数据成员占据内存单元数的和,但实际情况却并非如此,来看 一段:
• • • • • • • •
14.1.3 初始化结构变量
• 在声明结构变量的同时,可以进行变量的初始化,对结构 体中每个数据初始化,用逗号隔开,并用花括号包裹起来, 举例来看: • struct person zangsan={“Zang San”, 24, “zs@”}; • 还可以将结构体定义,结构体变量声明和初始化放在一起 来完成,如: • struct person • { • char name[20]; • int age; • char email[50]; • }zangsan={“Zang San”, 24, “zs@”}, *pzs=&zangsan;
•
14.1.5 结构体定义的位置
• 读者可以做个有趣的尝试:将中结构体定义的部分转移到 main函数的后面,重新编译运行,会发生什么? • 编译器会报一大堆的错误,正如“使用变量前必须先对其 声明”一样,在使用结构体类型声明结构体变量之前,必 须要先进行结构体的定义,编译器据此才知道如何为结构 体中的数据成员分配内存空间,才能声明结构体变量。 • 除了如的定义方式外,结构体还可以定义在函数(包括 main函数)中,两种定义方式的区别在于结构体可见域不 同,如果定义在函数外,从定义处到本文件结束,结构体 都可见,可用结构体声明结构体变量,但如果定义在特定 函数中,只有定义处到该函数结束,结构体可见,如果在 函数外使用结构体声明结构体变量,可能会引发错误。 • 一种推荐的写法是将结构体定义在头文件中,只要某文件A 包含了此头文件,便可在A中自由声明结构体变量。
14.3 共用体
• 共用体也是一种特殊的数据组织方式,C语言使用 关键字union来定义一个共用体结构,所以,在某 些书籍中也将共用体称为“联合”。和结构体类 似,共用体的使用也分为“共用体的定义”、 “共用体变量的声明、初始化和使用”两大部分。
14.3.1 什么是共用体
• 和结构一样,共用体也是由数据成员组成的,但 在结构中,编译器为每个数据成员都分配内存地 址空间,但对共用体来说,所有的数据成员共用 一块内存,这个“共用”似乎有些费解,理解方 式应当是“在某个确定的时刻,共用体只能表示 一种成员类型体在定义时成员列表中有多少项,在某个确定时刻,共用体变量
只能存储一个成员,来看一个示例:
14.3.6 共用体赋值
• 从本质上理解,共用体实际上是为不同的成员分 配一块共用内存,编译器并不会约束存入这块内 存的值,关键在于程序员如何解析这块内存,如 何使用存入的内容。 • C语言允许共用体变量间的赋值,且无论是结构体 变量的赋值还是共用体变量的赋值,实际上都是 内存单元的照搬复制。
第14章
结构体、共用体、枚举和typedef
• 程序设计中,如何合理组织数据是门大学问,前 面介绍过的数组是种组织数据的方式,但数组只 适用于同类型的数据,如果类型不同又当如何? 而且,现实中,很多东西都具有不同的属性,以 人为例,像姓名、性别、身高等等都是其属性, 如何合理存储并方便地访问这些信息,是本章介 绍的内容。
14.1.1 结构体的定义
• • • • • • • • • • • • • • 只有定义了一个结构体,才能声明并使用结构体变量,正如,只有确定了 名片上要印什么内容,才能开始印刷名片。结构体的定义就是说明结构体 变量要存储什么信息的过程。 C语言提供了关键字struct来定义一个结构,一般形式的结构定义为: struct 结构名称(或称标识) { 存储数据列表;(或称成员变量列表) }; 注意:在定义结构时,一定不要忘记花括号后的分号,因为结构的定义可 以看成一条完整的C++语句,否则编译器会报错。 举例来说, struct person { char name[20]; int age; char email[50]; };
14.1.2 声明结构体变量