结构体的概念 5.1结构体的概念 个结构就是将一个或多个不同类型的数据有序地组织在一起,并为之确定一个名字 所构成的一种数据类型。从这个意义上说,一个结构类似于数据库管理系统和 Pascal等高级程序设计 语言中的“记录”。不同名的结构代表不同的数据类型,即使两个结构具有完全相同的成员项。 定义一个结构名就是命名一个结构并说明它的组成情况。其目的是让C编译系统和程 序知道,在程序或函数中存在这样的一种数据类型,可以用它来定义与之相关的数据对象 构定义的一般形式为: struc t结构名{ 数据类型1 成员名1 数据类型n 成员名n 其中,关键字 struct用来引入一个结构说明,或指出一个结构定义的开始。“结构 ”是对该结构类型的命名,结构名按符的构成规则确定。一对大括号中定义了组成该结构的诸成员 ,每个成员项由成员名字、成员的数据类型和一个分号组成,一个结构中成员项的多少、顺序没有 数据类型i”用来指出对就成员的数据类型,它可以是任何数据类型名,包括C编 译程序固有的数据类型说明符,如int、 float、char、 double等等;了可以是本程序中已定义的另 结构名。 成员名i”就是组成该结构类型的成员i的名字,它按标识符的组成规则确定。 成员名i”和“结构名”可以与函数或程序中的其他对象名及其他结构中的成员名相同,面不产生矛 盾,C编译程序总是根据上、下文来区别它们的。 结构定义是一个整体,在程序中作为一个定义语句出现。,括住诸成员项说明的一对 括号和最后的分号不能遗漏,否则引起错误。又因为它是一个定义语句,所以一个结构定义可以在 函数的内部和函数的外部进行。 最后必须强调,关于上述形式的结构定义仅是描述了一个结构的“模型”,或者说只 是定义了一种名为“结构名”的数据类型,C编译程序并不给这样的定义分配对就的空间,因此它不是 个实在的数据对象
结构体的概念 5 . 1 结构体的概念 一个结构就是将一个或多个不同类型的数据有序地组织在一起,并为之确定一个名字 所构成的一种数据类型。从这个意义上说,一个结构类似于数据库管理系统和 Pascal 等高级程序设计 语言中的“记录”。不同名的结构代表不同的数据类型,即使两个结构具有完全相同的成员项。 定义一个结构名就是命名一个结构并说明它的组成情况。其目的是让 C 编译系统和程 序知道,在程序或函数中存在这样的一种数据类型,可以用它来定义与之相关的数据对象。 结构定义的一般形式为: struct 结构名{ 数据类型 1 成员名 1; … 数据类型 n 成员名 n; }; 其中,关键字 struct 用来引入一个结构说明,或指出一个结构定义的开始。“结构 名”是对该结构类型的命名,结构名按符的构成规则确定。一对大括号中定义了组成该结构的诸成员 项,每个成员项由成员名字、成员的数据类型和一个分号组成,一个结构中成员项的多少、顺序没有 限制。 “数据类型 i”用来指出对就成员的数据类型,它可以是任何数据类型名,包括 C 编 译程序固有的数据类型说明符,如 int、float、char、double 等等;了可以是本程序中已定义的另一 个结构名。 “成员名 i”就是组成该结构类型的成员 i 的名字,它按标识符的组成规则确定。 “成员名 i”和“结构名”可以与函数或程序中的其他对象名及其他结构中的成员名相同,面不产生矛 盾,C 编译程序总是根据上、下文来区别它们的。 结构定义是一个整体,在程序中作为一个定义语句出现。,括住诸成员项说明的一对 大括号和最后的分号不能遗漏,否则引起错误。又因为它是一个定义语句,所以一个结构定义可以在 函数的内部和函数的外部进行。 最后必须强调,关于上述形式的结构定义仅是描述了一个结构的“模型”,或者说只 是定义了一种名为“结构名”的数据类型,C 编译程序并不给这样的定义分配对就的空间,因此它不是 一个实在的数据对象
结构体变量的定义、初始化和引用 2结构体变量的定义、初始化和引用 定义结构体类型变量的方法 先声明结构体类型再定义变量名 旦一个结构类型被定义,便可以像用C固有的数据类型说明符定义变量那样来定 这种结构类型的变量,其定义形式是: struc t结构名结构变量名1,结构变量名2,…,结构变量名n: 其中“结构名”是已经定义过的结构类型名。如date, employee等。“结构变量 i”即是要定义的与指定结构名相关的变量名,它们都按标识符的构成规则确定 在声明结构体类型的同时定义变量 struct date Int month[4] year I birthdate, nationalday, hireday 直接定义结构类型变量 struc t int day char month[4]
结构体变量的定义、初始化和引用 5 . 2 结构体变量的定义、初始化和引用 一、定义结构体类型变量的方法 1. 先声明结构体类型再定义变量名 一旦一个结构类型被定义,便可以像用 C 固有的数据类型说明符定义变量那样来定 义这种结构类型的变量,其定义形式是: struct 结构名 结构变量名 1,结构变量名 2,…,结构变量名 n; 其中“结构名”是已经定义过的结构类型名。如 date,employee 等。“结构变量名 i”即是要定义的与指定结构名相关的变量名,它们都按标识符的构成规则确定。 2. 在声明结构体类型的同时定义变量 struct date{ int day; char month[4]; int year; } birthdate, nationalday, hireday; 3. 直接定义结构类型变量 struct { int day; char month[4];
int year I birthdate, nationalday, hiredate; 、结构体变量的引用 结构变量与数组在很多方面都是类似的。如它们的元素/成员都必须存放在一片连续 的存储空间中:通过存取数组元素来访间数组,与此类似,通过存取结构变量的成员来访问结构变 量:数组元素有数组元素的表示形式,结构变量的成员了有它的专用表示形式等等。但是,结构变量 与数组在概念上有重要区别:数组名是一组元素存放区域的起始位置,是一个地址量,结构变量名只 代表一组成员,它不是地址量而是一种特殊变量:数组中的元素都是有相同的数据类型,而结构中的 戎员的数据类型可以不相同。 结构变量的一般表示形式为: 结构变量名.成员名 这样的组合形式既是结构变量成员的表示形式,也是它的访问形式。其中的“.”号 称之为“结构成员运算符”,它用来连接结构谈是名与成员名,具有“从属于”的含义,即其后的成 名是前面的结构变量中的一个成员。 “.”是一个运算符,组合式“结构变量名.成员名”实质上是一个运算表达式。 具有与普通变量完全相同的性质,可以像普通变量那样参于各种运算,既可以出现在赋值号的左边 向它赋值,也可以出现在赋值号的右边作为一个运算分量参于表达式的计算。因此,它可以作为“+ +”、“--”、“&”等之类的运算符的操作数。例如:下面都是一些正确的结构变量成员的表示、 访问的例子 student1.name=“C.S.Sun”; student2. Score+=8l5 scanf(“%s”, student1.name) (1)不能将一个结构体变量作为一个整体进行输入和输出。如不能作如下引用: printf(“%d,%s,%c,%d,%f,%sn”, student1) (2)嵌套结构变量的访问 student. birthday. Month
int year; } birthdate, nationalday, hiredate; 二、结构体变量的引用 结构变量与数组在很多方面都是类似的。如它们的元素/成员都必须存放在一片连续 的存储空间中;通过存取数组元素来访问数组,与此类似,通过存取结构变量的成员来访问结构变 量;数组元素有数组元素的表示形式,结构变量的成员了有它的专用表示形式等等。但是,结构变量 与数组在概念上有重要区别:数组名是一组元素存放区域的起始位置,是一个地址量,结构变量名只 代表一组成员,它不是地址量而是一种特殊变量;数组中的元素都是有相同的数据类型,而结构中的 成员的数据类型可以不相同。 结构变量的一般表示形式为: 结构变量名.成员名 这样的组合形式既是结构变量成员的表示形式,也是它的访问形式。其中的“.”号 称之为“结构成员运算符”,它用来连接结构谈是名与成员名,具有“从属于”的含义,即其后的成 员名是前面的结构变量中的一个成员。 “.”是一个运算符,组合式“结构变量名.成员名”实质上是一个运算表达式。 它具有与普通变量完全相同的性质,可以像普通变量那样参于各种运算,既可以出现在赋值号的左边 向它赋值,也可以出现在赋值号的右边作为一个运算分量参于表达式的计算。因此,它可以作为“+ +”、“--”、“&”等之类的运算符的操作数。例如:下面都是一些正确的结构变量成员的表示、 访问的例子。 student1. name=“C.S.Sun”; student2. Score+=87.5; scanf(“%s”, student1. name); 注意: (1)不能将一个结构体变量作为一个整体进行输入和输出。如不能作如下引用: printf(“%d, %s, %c, %d, %f, %s\n”, student1); (2)嵌套结构变量的访问: student. birthday. Month
(3)对结构体变量的成员可以像普通变量一样进行各种运算 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如 scanf(“%d”,& strudent.num) printf(“%o”,& student1) 、结构体变量的初始化 struc t结构名结构变量名1={初始化值表1} 结构变量名2={初始化值表2} 结构变量名n={初始化值表n} 其中,“初始化值表”列出了结构变量的和个成员的初始数据。该表中的数据项必须都是常量,包含 的数据个数、顺序、类型应与结构变量的成员的个数、顺序、类型一致,它们之间用逗号隔开。C编译 程序将它们顺序赋给结构变量的对应成员项 结构体数组 5.3结构体数组 C语言允许定义结构数组,数组中的每一个元素都是同一个结构类型的结构变量。结 构数组的定义与结构变量的定义在语法上是一样的,与普通数组的定义相同,也可以定义多维结构数 下面以一维数组为例给出结构数组的一般定义形式。 定义 形式1: struct结构名结构数组名1[元素个数],结构数组名2[元素个数
(3)对结构体变量的成员可以像普通变量一样进行各种运算。 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如: scanf(“%d”, &strudent.num); printf(“%o”, &student1); 三、结构体变量的初始化 struct 结构名 结构变量名 1={初始化值表 1}, 结构变量名 2={初始化值表 2}, … 结构变量名 n={初始化值表 n}; 其中,“初始化值表”列出了结构变量的和个成员的初始数据。该表中的数据项必须都是常量,包含 的数据个数、顺序、类型应与结构变量的成员的个数、顺序、类型一致,它们之间用逗号隔开。C 编译 程序将它们顺序赋给结构变量的对应成员项。 结构体数组 5 . 3 结构体数组 C 语言允许定义结构数组,数组中的每一个元素都是同一个结构类型的结构变量。结 构数组的定义与结构变量的定义在语法上是一样的,与普通数组的定义相同,也可以定义多维结构数 组。下面以一维数组为例给出结构数组的一般定义形式。 1.定义: 形式 1:struct 结构名 结构数组名 1[元素个数],结构数组名 2[元素个数 2],…;
形式2: struct结构名{ /*成员项定义*/ }结构数组名1[元素个数1],结构数组名2[元素个数 如: struct student{ int n char name char sex fI har addr[301 以上定义了一个数组stu,其元素为 struct student类型数据,数组有3个元素 也可以如下定义: struct int char sex float score 结构数组的初始化 如: struct student
形式 2:struct 结构名{ … /*成员项定义*/ }结构数组名 1[元素个数 1],结构数组名 2[元素个数 2],…; 如:struct student{ int num; char name[20]; char sex; float score; char addr[30]; }stu[3]; 以上定义了一个数组 stu,其元素为 struct student 类型数据,数组有 3 个元素。 也可以如下定义: struct { int num; char name[20]; char sex; float score; char addr[30]; } stu[3]; 2.结构数组的初始化 如:struct student{