C语言中的结构体,联合,链表和枚举,位域(上)
- 格式:doc
- 大小:103.50 KB
- 文档页数:18
C语言结构体与联合体C语言是一种被广泛应用于软件开发领域的编程语言。
在C语言中,结构体与联合体是两种重要的数据类型,用于组织和管理复杂的数据结构。
本文将为您介绍C语言中结构体与联合体的概念、用法以及它们在程序设计中的应用。
一、结构体1. 结构体的定义结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量,这些变量按照定义的顺序依次存储在内存中,形成一个有组织的数据结构。
结构体的定义通常在函数外部进行,用关键字"struct"后跟结构体的名称表示。
2. 结构体成员的访问与赋值结构体的成员可以使用“.”操作符进行访问和赋值。
例如,假设我们定义了一个名为"Person"的结构体,其中包含了"name"和"age"两个成员变量,则可以使用""和"person.age"来访问和赋值这两个成员变量的值。
3. 结构体作为函数参数和返回值在程序设计中,我们经常需要将结构体作为参数传递给函数或作为函数的返回值。
通过传递结构体的指针,可以避免结构体数据的拷贝,提高程序的运行效率。
当函数返回结构体时,可以借助指针或将结构体作为函数的实参传递。
二、联合体1. 联合体的定义联合体是一种特殊的数据类型,允许在同一块内存空间中存储不同类型的数据。
联合体的定义方式与结构体相似,只需将关键字"struct"替换为"union"。
在联合体中,各个成员变量在内存中共享同一块空间。
2. 联合体成员的访问与赋值联合体的成员可以使用"."操作符进行访问和赋值,与结构体类似。
不同的是,联合体中只能同时存储一个成员的值。
当对联合体的某个成员进行赋值时,原有成员的值将被覆盖。
3. 联合体的应用场景联合体通常用于在不同类型的数据中进行转换或操纵。
例如,可以使用联合体将一个整型数据和一个字符型数据在内存中共享同一块空间,实现数据的类型转换或节省内存空间。
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语言中的联合(union)和结构(structure)是两种用于组织和处理数据的复合数据类型。
它们的主要区别在于数据的存储方式和使用方式。
1.存储方式:-结构体的成员在内存中是按照顺序依次存放的,每个成员占用一段独立的内存空间,它们可以同时存储不同类型的数据。
-联合的所有成员共用一段内存空间,不同成员的内存地址都是相同的,仅能存储一个成员的值。
2.内存占用:-结构体的内存占用是所有成员内存大小之和,而实际使用时会有额外的内存开销用于存储成员之间的间隙。
-联合的内存占用是占用最大成员的内存大小,它不会为了存储其他成员的数据而浪费额外的内存空间。
3.成员之间的访问:-结构体的成员可以同时被访问和使用,通过成员名来引用具体的成员。
-联合只能同时访问一个成员,因为它们共用同一块内存。
访问其他成员需要重新赋值。
4.数据类型:-结构体可以含有不同类型的成员,也可以含有自定义的数据类型,因此结构体的灵活性更高。
-联合的成员只能是一种数据类型,因为它们共享同一块内存空间。
5.内存对齐:-结构体中的成员通常按照系统的内存对齐规则进行对齐,这意味着一些成员可能会因为对齐而浪费额外的内存。
-联合的成员不会被对齐,因为它们共享同一块内存。
6.使用场景:-结构体适用于需要存储多个不同类型的数据,并且需要同时访问或处理这些数据的情况,例如定义一个学生结构体来存储学生的姓名、年龄、分数等信息。
-联合适用于需要共享内存空间来存储不同状态或不同类型数据的情况。
例如,可以定义一个联合用于存储一个整型数值或字符数组,并根据具体需求使用其中的一个成员。
总的来说,结构体适用于存储和处理多个不同类型的数据,而联合适用于在一段内存中共享存储不同数据类型的数据。
选择使用哪种复合数据类型取决于具体的需求和场景。
C语言结构体与联合体C语言是一种广泛应用的编程语言,它提供了丰富的数据类型来满足各种编程需求。
其中,结构体和联合体是两种特殊的数据类型,它们在C语言中具有重要的作用。
本文将深入探讨C语言结构体和联合体的概念、定义、用法以及它们的区别。
一、结构体结构体是一种复合的数据类型,它允许我们在一个容器中存储不同类型的数据。
通过结构体,我们可以将多个相关的数据组合在一起,形成一个自定义的数据类型,并可以对该类型的数据进行操作和访问。
在C语言中,我们可以使用关键字"struct"来定义一个结构体。
例如,以下是一个表示学生信息的结构体的定义:```struct Student {char name[20];int age;float score;};```上述代码中,我们定义了一个名为"Student"的结构体,它包含三个成员变量:name(姓名,字符型数组)、age(年龄,整型)和score (分数,浮点型)。
定义结构体后,我们可以声明结构体类型的变量,并为其成员变量赋值。
例如:```struct Student stu1;strcpy(, "Tom");stu1.age = 18;stu1.score = 95.5;```上述代码中,我们声明了一个名为"stu1"的结构体变量,并给其成员变量name、age和score赋了初值。
之后,我们可以通过点(.)运算符来访问结构体中的成员变量,并进行相应的操作。
二、联合体联合体是一种特殊的数据类型,它允许在同一个内存空间中存储不同类型的数据。
与结构体不同的是,联合体中的成员变量共享同一块内存,因此同一时间只能存储其中一个成员变量的值。
在C语言中,我们可以使用关键字"union"来定义一个联合体。
例如,以下是一个表示坐标的联合体的定义:```union Point {int x;int y;};```上述代码中,我们定义了一个名为"Point"的联合体,它包含两个成员变量:x(横坐标,整型)和y(纵坐标,整型)。
c语言union和位域的使用在 C 语言中,`union`( 联合体)和位域(bit-fields)都是用于在内存中对数据进行灵活组织的特性。
1. 联合体 union):`union`是一种特殊的数据结构,允许在相同的内存位置存储不同的数据类型。
`union`中的所有成员共享同一块内存空间。
`union`的大小等于其最大成员的大小。
这意味着`union`中只能存储其中一个成员的值。
以下是一个`union`的简单示例:union MyUnion {int i;float f;char str[20];};在这个例子中,`MyUnion`是一个联合体,它包含了一个整数`i`、一个浮点数`f` 和一个字符数组`str`。
尽管这些成员占用同一块内存空间,但只能存储其中一个成员的值。
存储一个成员的值后,其他成员的值会被覆盖。
2. 位域 bit-fields):位域允许在结构体中以位(bit)为单位对数据进行存储。
通过使用位域,可以精确地控制特定数据的位数,从而节省内存空间。
以下是位域的简单示例:struct BitFields {unsigned int isMale : 1; // 1位用于存储性别信息unsigned int age : 7; // 7位用于存储年龄信息};在这个例子中,`BitFields`是一个结构体,它包含了两个位域成员`isMale` 和`age`。
`isMale` 用于存储性别信息(1 位),`age` 用于存储年龄信息(7 位)。
通过位域,可以有效地利用位数,而不是整个字节来存储数据,节省内存空间。
需要注意的是,位域在不同的编译器和系统中可能有不同的行为和实现方式,具体的使用要根据具体情况谨慎选择。
总体而言,`union` 和位域提供了在C 语言中对数据进行更灵活组织和管理的方式,但在使用时需要注意内存对齐、可移植性和程序的可读性等问题。
C语言中的结构体和联合体在C语言中,结构体和联合体是两种用来组织数据的重要数据类型。
它们允许我们将不同类型的数据组合在一起,以便于管理和处理。
在本文中,我将详细介绍C语言中的结构体和联合体,包括它们的定义、访问和使用方法。
首先,让我们来看看结构体(struct)的定义和用法。
结构体是一种用户自定义的数据类型,可以包含不同类型的数据成员。
结构体的定义一般如下:```struct 结构体名 {数据类型1 成员名1;数据类型2 成员名2;...};```例如,我们可以定义一个表示学生信息的结构体:```struct Student {char name[20];int age;float score;};```在这个例子中,我们定义了一个名为Student的结构体,它包含了学生的姓名、年龄和成绩三个数据成员。
要使用结构体,我们可以按照以下方式声明结构体变量并对其进行初始化:```struct Student stu1 = {"Alice", 20, 85.5};```我们也可以通过成员访问运算符(.)来访问结构体变量中的成员:```printf("Name: %s\n", );printf("Age: %d\n", stu1.age);printf("Score: %.1f\n", stu1.score);```接下来,让我们来了解一下联合体(union)的定义和用法。
联合体与结构体类似,也是一种用户自定义的数据类型,但不同的是,联合体的成员共享一块内存空间。
因此,联合体的大小等于其最大成员的大小。
联合体的定义一般如下:```union 联合体名 {成员1数据类型成员1名称;成员2数据类型成员2名称;...};```举个例子,我们可以定义一个表示长方形的联合体:```union Rectangle {int width;int height;};```在这个例子中,我们定义了一个名为Rectangle的联合体,它包含了长方形的宽和高两个成员。
C语⾔言 - 结构体、联合体、枚举struct - 结构体结构体是由⼀一系列列具有相同类型或不同类型的数据构成的数据集合。
定义结构体结构体可以定义在主函数外,也可以定义在主函数内。
和定义函数⼀一样,只有在定义下⽅方的代码才能够识别,在上⽅方的代码需要申明之后再使⽤用。
结构体的定义⽅方式如下:struct结构体名称{变量量类型变量量名;变量量类型变量量名;...}结构体变量量名;例例如⼀一个统计学⽣生成绩的结构体,它包含了了 id, name, math_score, c_score, english_score 等内容:struct stu{char id[20];char name[20];double math_score;double c_score;double english_score;}s[10];定义完结构体之后,我们就可以在其他地⽅方使⽤用:struct stu a;结构体变量量struct stu *p结构体指针struct stu s[10];结构体数组struct stu func()返回⼀一个结构体类型的函数结构体的赋值在初始化时,我们可以直接通过{和}来为结构体赋值,赋值的顺序就是定义的顺序:struct stu a = {"123", "Aaron", 77, 89, 88};struct stu b[2] = {{"456", "Candy", 87, 86, 72}, {"789", "David", 67, 99, 78}}在初始化之后,我们就不能够直接对结构体进⾏行行整体赋值了了,⽽而只能⼀一次修改其中的某⼀一项值:struct stu *p, a = {"123", "Aaron", 77, 89, 88};p =&a; // p为结构体指针a.math_score =79; // 结构体变量量使⽤用.来访问内容(*p).c_score =87;p->english_score =92; // 结构体指针可以使⽤用->来代替(*p).访问内容printf("%s %s %lf %lf %lf\n", a.id, , a.math_score, a.c_score,a.english_score);两个同类型的结构体变量量是⽀支持赋值的,比如下⽅方的代码就直接将 b 的每个元素的值赋给了了 a :struct stu a = {"456", "Candy", 87, 86, 72};struct stu b = {"789", "David", 67, 99, 78};a = b;printf("%s %s %lf %lf %lf\n", a.id, , a.math_score, a.c_score,a.english_score);union - 联合体联合体的定义⽅方法与规则与结构体类似,因此这⾥里里就不再重复。
c语言结构体联合体数组例子【最新版】目录1.C 语言结构体和联合体的概念2.C 语言结构体和联合体的应用3.C 语言结构体和联合体的区别4.C 语言数组和结构体、联合体的关系5.C 语言结构体和联合体的例子正文C 语言结构体和联合体是 C 语言中重要的数据结构,它们在编程中具有广泛的应用。
结构体和联合体在功能上具有一定的相似性,但它们在使用和实现上有所区别。
本文将从结构体和联合体的概念、应用、区别以及与数组的关系等方面进行介绍,并通过例子加以说明。
首先,我们来了解 C 语言结构体和联合体的概念。
结构体是一种复合数据类型,它是由不同类型的数据组成的集合。
结构体中的每个元素称为成员,这些成员可以是基本数据类型或者其他已经定义的结构体。
联合体是一种特殊的结构体,它的每个成员都是同一种类型的数据。
结构体和联合体在 C 语言编程中有广泛的应用。
例如,在表示复杂数据结构时,可以使用结构体来描述。
联合体则常用于表示一组具有相同性质的数据。
结构体和联合体在功能上具有一定的相似性,但它们在使用和实现上有所区别。
结构体可以包含不同类型的成员,而联合体只能包含相同类型的成员。
此外,结构体中的成员可以被分别访问和修改,而联合体中的成员共享同一内存空间,修改一个成员会影响其他成员的值。
C 语言数组和结构体、联合体有着密切的关系。
数组是一种特殊的结构体,它可以看作是一个包含多个相同类型元素的结构体。
数组名在 C 语言中被视为指向数组首元素的指针,因此,数组可以用结构体和联合体的方式来表示。
下面我们通过一个例子来说明 C 语言结构体和联合体的应用。
假设我们需要表示一个学生的信息,包括学号、姓名、年龄和成绩,我们可以使用结构体来实现:```ctypedef struct {int id;char name[20];int age;float score;} Student;```如果我们需要表示多个学生的信息,可以使用数组来存储结构体:```cStudent students[3] = {{1, "张三", 20, 89.5},{2, "李四", 21, 95.0},{3, "王五", 19, 78.0}};```对于联合体的应用,假设我们需要表示一个简单的图形,包括长和宽两个属性,我们可以使用联合体来实现:```ctypedef union {int length;int width;} Dimension;```然后我们可以使用联合体来表示图形的尺寸:```cDimension size = {10, 20};```通过以上例子,我们可以看到 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. 枚举常量的值可以是任何整数类型,但结构体成员变量必须是具体的数据类型。
初步剖析C语言编程中的结构体初步剖析C语言编程中的结构体C语言结构体,可谓是C强大功能之一,也是C++语言之所以能衍生的有利条件,事实上,当结构体中成员中有函数指针了后,那么,结构体也即C++中的类了。
欢迎大家阅读!更多相关信息请关注相关栏目!C语言中,结构体的声明、定义是用到关键字struct,就像联合体用到关键字union、枚举类型用到enum关键字一样,事实上,联合体、枚举类型的用法几乎是参照结构体来的。
结构体的声明格式如下:struct tag-name{{member 1;…member N;};因此,定义结构体变量的语句为:struct tag-name varible-name,如struct point pt;其中,point 为tag-name,pt是结构体struct point变量。
当然,也可以一次性声明结构体类型和变量,即如下:struct tag-name {…} x,y,z;就类似于int x,y,z;语句一样。
也可以在定义结构体变量时即赋初值,即变量初始化,struct point pt={320,200};当然,也就可以有结构体指针、结构体数组了。
访问结构体变量中的member的方法有:如果是由结构体变量名来访问,则是structure-variable-name.member;如果是由结构体变量指针来访问,则是structure-variable-pointer->member;好了,上面的不是重点,也不难掌握,只是细节问题。
结构体具有重要的应用,如下的:如自引用的结构体,常用来作为二叉树等重要数据结构的实现:假设我们要实现一个普遍的问题的解决算法——统计某些输入的各单词出现的频数。
由于输入的单词数是未知,内容未知,长度未知,我们不能对输入进行排序并采用二分查找。
……那么,一种解决办法是:将已知的单词排序——通过将每个到达的.单词排序到适当位置。
当然,实现此功能不能通过线性排序,因为那样有可能很长,相应地,我们将使用二叉树来实现。
C语言中的结构体与联合体结构体和联合体是C语言中两种重要的数据类型,它们可以用来组织和管理不同类型的数据。
本文将详细介绍C语言中的结构体和联合体的定义、用法以及它们之间的区别。
一、结构体的定义和用法结构体是一种用户自定义的数据类型,它可以包含多个不同类型的数据成员。
通过结构体,我们可以将相关的数据组织在一起,方便管理和操作。
在C语言中,定义结构体需要使用关键字"struct",并在大括号中列出结构体成员的数据类型和变量名。
例如:```struct Student {char name[20];int age;float score;};```以上代码定义了一个名为"Student"的结构体,其中包含了三个成员:name(字符数组类型)、age(整型)和score(浮点型)。
我们可以通过结构体名和成员名使用结构体变量。
例如:```struct Student stu;strcpy(, "Tom");stu.age = 18;stu.score = 89.5;```通过"."运算符,我们可以访问结构体变量的成员,并对其进行赋值或者读取。
以上代码给"stu"结构体变量的成员赋予了相应的值。
结构体还可以作为函数的参数传递,以及作为函数的返回值。
这样可以方便地将复杂的数据结构传递给函数并进行处理。
二、联合体的定义和用法联合体(Union)也是一种用户自定义的数据类型,它与结构体类似,可以包含多个成员,但不同的是,联合体所有成员共享同一块内存空间。
在C语言中,定义联合体需要使用关键字"union",并在大括号中列出各个成员的数据类型和变量名。
例如:```union Data {int num;char ch;float f;};```以上代码定义了一个名为"Data"的联合体,其中包含了三个成员:num(整型)、ch(字符类型)和f(浮点型)。
C语⾔结构体,枚举,联合体详解⽬录1.什么是结构体、枚举、联合体2.定义结构体2.1 包含结构体成员变量、variable2.2 tag、结构体成员变量2.3 ⽤结构体声名变量2.4 ⽤typedef 创建新类型2.5 两个结构体相互包含2.6 结构体变量初始化2.7 结构体指针3.枚举3.1 定义⽅式3.2 为什么⽤枚举3.3 枚举变量的定义3.4 实例3.5 枚举实际⽤途4.联合体4.1 与结构体区别4.2 定义总结1.什么是结构体、枚举、联合体结构体(struct)是由⼀系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。
如下⾯的student结构体包含三个成员,分别是name、num、age。
枚举(enum)是C语⾔的⼀种特殊类型。
当我们在编程中遇到定义⼀些固定长度或范围的数值时,可以考虑使⽤枚举类型。
使⽤枚举可以让我们的程序可读性更强、看起来更加直观。
举个例⼦,如果我们在编程中需要使⽤数字06分别表⽰星期⽇星期六,程序的可读性就不⾼,我们需要翻⼿册或者看程序注释才能知道每个数字具体代表什么意思。
如果我们使⽤枚举呢,基本上不需要看注释或⼿册就可知晓其⼤意。
联合体是⼀种结构。
它的所有成员相对于基地址的偏移量都是0。
此结构空间要⼤到⾜够容纳最宽的成员。
其对其⽅式适合其中所有成员。
123456// 创建结构体struct student{char *name; // 学⽣名字int num; // 学⽣学号intage; // 学⽣年龄};2.定义结构体12struct tag{ 成员变量...}variable;通常,tag 、结构体成员变量、variable 这3个部分⾄少要出现2个2.1 包含结构体成员变量、variable1234struct {char name[100];int age;}s1;//s1相当于对这个结构体声明了⼀个变量,可以在程序中直接调⽤s1相当于声明的全局变量。
C语言中的结构体与联合体详解C语言是一门广泛应用于系统开发和嵌入式领域的编程语言。
在C 语言中,结构体和联合体是两种常用的复合数据类型。
本文将详细讨论结构体和联合体在C语言中的使用以及它们的区别。
一、结构体 (Struct)结构体是一种自定义的数据类型,允许我们将不同类型的变量组合在一起,形成一个新的数据类型。
它以"struct"关键字开始,后面跟着结构体的名称,然后是一对花括号{ }。
在花括号中,我们可以定义多个不同类型的成员变量,每个成员变量用分号结束。
举个例子,假设我们需要表示一个学生的信息,我们可以定义一个包含学生姓名、年龄和成绩的结构体:```cstruct Student {char name[50];int age;float score;};```在上面的例子中,我们定义了一个名为Student的结构体,它有三个成员变量:name、age和score。
使用结构体时,我们可以通过"结构体名.成员名"的方式来访问成员变量。
例如,要输出学生的姓名,我们可以使用`printf("%s",)`。
二、联合体 (Union)联合体也是一种自定义的数据类型,它允许我们在同一块内存空间中存储不同类型的数据。
与结构体不同的是,联合体中的成员变量共享同一块内存空间,因此只能同时存储其中的一个成员变量。
联合体以"union"关键字开始,后面跟着联合体的名称,然后是一对花括号{ }。
在花括号中,我们可以定义多个不同类型的成员变量,每个成员变量用分号结束。
举个例子,假设我们需要表示一个图形的信息,我们可以定义一个包含圆的半径和矩形的长度和宽度的联合体:```cunion Shape {float radius;struct {float length;float width;} rectangle;};```在上面的例子中,我们定义了一个名为Shape的联合体,它有两个成员变量:radius和rectangle。
C语⾔中结构、联合、枚举的说明复杂的数据类型⼀般的步骤:1、声明模板2、定义变量,分配内存空间3、初始化++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++标记、标识符、标签++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++结构:设计程序很重要的⼀步是提⾼表⽰数据的能⼒,选择表⽰数据的⽅法。
C提供了结构变量(structure variable)提⾼你表⽰数据的能⼒。
14.1 建⽴结构声明结构声明(structure variable)描述了⼀个结构的组织布局。
声明类似如下:struct book{char title[MAXTITL];char author[MAXAUTL];float value;};该声明并未创建实际的数据对象,只描述了该对象由什么组成。
(结构声明有时候称为模板)关键字struct,表明跟在其后的是⼀个结构,后⾯是⼀个可选的标记。
后⾯的程序可以根据标记引⽤该结构。
如果打算重复使⽤该模板,就要使⽤带标记的形式。
⽤花括号括起来的是结构成员列表。
花括号后⾯的分号是必须的,表明结构布局定义结束。
14.2 定义结构变量结构有两层含义。
⼀层含义是“结构布局”,结构布局告诉编译器如何表⽰数据,但是它并未让编译器为数据分配空间。
下⼀步是创建⼀个结构变量,即是结构的另⼀层含义。
例如 struct book library;编译器执⾏这⾏代码便创建了结构变量library。
编译器使⽤book模板为该变量分配空间。
解释:⼀个内含MAXTITL个元素的char数组,⼀个内含MAXAUTL个元素的char数组和⼀个float类型的变量;这些存储空间都与⼀个名称library结合在⼀起。
struct book的作⽤相当于声明了⼀个int或float。
C语言中的结构体,联合,链表和枚举,位域(上)2012-2-16 10:47 | 发布者: benben | 查看数: 36 | 评论数: 0摘要: 结构名只能表示一个结构形式,编译系统并不对它分配内存空间。
只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。
一、结构的定义定义一个结构的一般形式为: struct 结构名 { 成员表列 }; 成员表由 ... 结构名只能表示一个结构形式,编译系统并不对它分配内存空间。
只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。
一、结构的定义定义一个结构的一般形式为:struct 结构名{成员表列};成员表由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu { int num; char name[20]; char sex; float score; };在这个结构定义中,结构名为stu,该结构由4个成员组成。
第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。
应注意在括号后的分号是不可少的。
结构定义之后,即可进行变量说明。
凡说明为结构stu的变量都由上述4个成员组成。
由此可见,结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
二、结构类型变量的说明说明结构变量有以下三种方法。
以上面定义的stu为例来加以说明。
1. 先定义结构,再说明结构变量。
如:struct stu{int num;char name[20];char sex;float score;};struct stu boy1,boy2;说明了两个变量boy1和boy2为stu结构类型。
也可以用宏定义使一个符号常量来表示一个结构类型,例如:#define STU struct stuSTU{int num;char name[20];char sex;float score;};STU boy1,boy2;2. 在定义结构类型的同时说明结构变量。
例如:struct stu{int num;char name[20];char sex;float score;}boy1,boy2;3. 直接说明结构变量。
例如:struct{int num;char name[20];char sex;float score;}boy1,boy2;第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。
三种方法中说明的boy1,boy2变量都具有图7.1所示的结构。
说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。
在上述stu 结构定义中,所有的成员都是基本数据类型或数组类型。
成员也可以又是一个结构,即构成了嵌套的结构。
例如,图7.2给出了另一个数据结构。
按图7.2可给出以下结构定义:struct date{int month;int day;int year;}struct{int num;char name[20];char sex;struct date birthday;float score;}boy1,boy2;首先定义一个结构date,由month(月)、day(日)、year(年) 三个成员组成。
在定义并说明变量 boy1 和 boy2 时,其中的成员birthday被说明为data结构类型。
成员名可与程序中其它变量同名,互不干扰。
结构变量成员的表示方法在程序中使用结构变量时,往往不把它作为一个整体来使用。
在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。
表示结构变量成员的一般形式是:结构变量名.成员名例如:boy1.num 即第一个人的学号 boy2.sex 即第二个人的性别如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。
例如:boy1.birthday.month 即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。
结构变量的赋值前面已经介绍,结构变量的赋值就是给各成员赋值。
可用输入语句或赋值语句来完成。
[例7.1]给结构变量赋值并输出其值。
main(){struct stu{int num;char *name;char sex;float score;} boy1,boy2;boy1.num=102;="Zhang ping";printf("input sex and score\n");scanf("%c %f",&boy1.sex,&boy1.score);boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。
用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。
最后分别输出boy2 的各个成员值。
本例表示了结构变量的赋值、输入和输出的方法。
结构变量的初始化如果结构变量是全局变量或为静态变量,则可对它作初始化赋值。
对局部或自动结构变量不能作初始化赋值。
[例7.2]外部结构变量初始化。
struct stu{int num;char *name;char sex;float score;} boy2,boy1={102,"Zhang ping",'M',78.5};main(){boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}struct stu{int num;char *name;char sex;float score;}boy2,boy1={102,"Zhang ping",'M',78.5};main(){boy2=boy1;……}本例中,boy2,boy1均被定义为外部结构变量,并对boy1作了初始化赋值。
在main函数中,把boy1的值整体赋予boy2,然后用两个printf语句输出boy2各成员的值。
[例7.3]静态结构变量初始化。
main(){static struct stu{int num;char *name;char sex;float score;}boy2,boy1={102,"Zhang ping",'M',78.5};boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}static struct stu{int num;char *name;char sex;float score;}boy2,boy1={102,"Zhang ping",'M',78.5};本例是把boy1,boy2都定义为静态局部的结构变量,同样可以作初始化赋值。
结构数组数组的元素也可以是结构类型的。
因此可以构成结构型数组。
结构数组的每一个元素都是具有相同结构类型的下标结构变量。
在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。
如一个班的学生档案,一个车间职工的工资表等。
结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。
例如:struct stu{int num;char *name;char sex;float score;}boy[5];定义了一个结构数组boy1,共有5个元素,boy[0]~boy[4]。
每个数组元素都具有struct stu的结构形式。
对外部结构数组或静态结构数组可以作初始化赋值,例如:struct stu{int num;char *name;char sex;float score;}boy[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};}当对全部元素作初始化赋值时,也可不给出数组长度。
[例7.4]计算学生的平均成绩和不及格的人数。
struct stu{int num;char *name;char sex;float score;}boy[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},};main(){int i,c=0;float ave,s=0;for(i=0;i<5;i++){s+=boy[i].score;if(boy[i].score<60) c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}本例程序中定义了一个外部结构数组boy,共5个元素,并作了初始化赋值。
在main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score 的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。