结构体的概念 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{
Int num char name har sex. float score char addr[30] }stu[3]={{10101,“ LiLin”,’M’,87.5,“103 Beijing rpad”}, {10102,“ ZhangFu”,’M'’,99,“10 Shangha Road”} 10104,“ WangMin”,’F’,78.5,“10 ZhongShan road”} 指向结构体的指针 5.4指向结构体的指针 1.结构指针:指向结构变量的指针 2.结构指针的定义 struc t结构名结构指针名 结构名”为先前已定义过的结构类型的名字,“结构指针名”为要定义的结构指 它按标识符的组成规则确定,“结构指针名”前的“★”不能遗漏,否则就变成定义一般的结构 量了 例如: struct date*pd 定义了一个指向结构名为date的结构指针pd 3.结构指针初始化 结构指针可以在定义结构类型名时同时定义,并可同时为其指定初始化值。例如
int num; char name[20]; char sex; float score; char addr[30]; }stu[3]={{10101,“LiLin”,’M’,87.5,“103 Beijing Rpad”}, {10102,“ZhangFun”,’M’,99, “10 Shanghai Road”}, {10104,“WangMin”,’F’,78.5,“10 ZhongShan Road”}}; 指向结构体的指针 5 . 4 指向结构体的指针 1.结构指针:指向结构变量的指针 2. 结构指针的定义: struct 结构名 *结构指针名; “结构名”为先前已定义过的结构类型的名字,“结构指针名”为要定义的结构指 针,它按标识符的组成规则确定,“结构指针名”前的“*”不能遗漏,否则就变成定义一般的结构 变量了。 例如:struct date *pd; 定义了一个指向结构名为 date 的结构指针 pd。 3. 结构指针初始化 结构指针可以在定义结构类型名时同时定义,并可同时为其指定初始化值。例如:
struct date I har month[4] I birthday, *pd, *pq=&birthday 4.结构指针变量的引用 (*结构指针名).成员名 如:(*pq).day (=pq). montI (*pg). year 旦定义了结构指针,且已使它指向了一个结构变量,那么就可以用该结构指针 来存取所指向的结构变量中的成员 但要注意的是:*pq两边的小括号不能省,因为结构成员运算符“.”的运算优先组 于“*”运算符 由于用结构指针访问结构对象中成员的操作在程序中用得很多,但像(*pq).year这样 引用,书写既不直观且易出错,所以C语言另外提供了一种新的专用运算符“一>”来代替先前的 算符“.”。这种运算符只组用于结构指针,引用结构变量成员的形式就变为: pq->month 这种结构成员的表示法比较方便、直观,更符合人的习惯与思维方式 套的结构指针的引用 若结构指针p指向结构变量 student1,结构指针q是 student1的一个成 且year是q指向对象的一个成员,那么成员year的表示形式为
struct date{ int day; char month[4]; int year; }birthday,*pd,*pq=&birthday; 4.结构指针变量的引用 (*结构指针名).成员名 如:(*pq).day (*pq).month (*pq).year 一旦定义了结构指针,且已使它指向了一个结构变量,那么就可以用该结构指针 来存取所指向的结构变量中的成员。 但要注意的是:*pq 两边的小括号不能省,因为结构成员运算符“.”的运算优先组 高于“*”运算符。 由于用结构指针访问结构对象中成员的操作在程序中用得很多,但像(*pq).year 这样 的引用,书写既不直观且易出错,所以 C 语言另外提供了一种新的专用运算符“->”来代替先前的 运算符“.”。这种运算符只组用于结构指针,引用结构变量成员的形式就变为: 或:pq->day pq->month pq->year 这种结构成员的表示法比较方便、直观,更符合人的习惯与思维方式。 5.嵌套的结构指针的引用 若结构指针 p 指向结构变量 student1,结构指针 q 是 student1 的一个成 员, 且 year 是 q 指向对象的一个成员,那么成员 year 的表示形式为:
year 或 year 注意 算符具有相同的优先级与结合性。在这种情况下,运算符 “,”不能用“一>”来代替。 struct date int da char *month: int year } birthday={14,“Sep”,1951} struct employee char name [20]: double salary; long int tel char sex; struct date *q I person1=("HY. Jiang", 960. 86, 66341071, *p=&personl #include main() i p->g=&birthday p->sex printf("Name: %s\nsex: %c\nDateOfBirth: %2d. %s. %4d\n Tele. No: %1d \n", p->name, p->sex, p->q->day p->q->month, p->g->year, p->tel) 公用体 5.5公用体
p->q->year 或 (p->q)->year 注意:“->”和“.”运算符具有相同的优先级与结合性。在这种情况下,运算符 “.”不能用“->”来代替。 例如: struct date{ int day; char *month; int year; }birthday={14,“Sep”,1951}; struct employee{ char name[20]; double salary; long int tel; char sex;struct date *q; }person1={“H.Y.Jiang”,960.86,6634107},*p=&person1; #include main( ) { p->q=&birthday; p->sex=‘M’; printf(“Name:%s\nsex:%c\nDateOfBirth:%2d .%s .%4d\n Tele.No:%ld\n”,p->name, p->sex, p->q->day, p->q->month, p->q->year, p->tel); } 公用体 5 . 5 公用体
联合(共同体)也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同 的数据类型,因为有时我们需要使几种不同类型的变量放到同一内存单元中。允许利用同一存储区域 来存储、处理不同类型的数据。例如:学校的教师和学生所填一个表格。其中,职业一项分为“教 师”和“学生”两类。对“单位”一项,学生填入班级编号,而教师则应填入某系某教研室。班级可 用整型量表示,而某系某教研室只能用字符串型。要求把这两种类型不同的数据均填入“单位”这个 变量中,就必须把“单位”定义为包含整型量和字符数组这两种类型的联合(共同体)。这种使几个 不同的变量共占同一段内存的结构,称为“联合”(共同体)类型的结构 共用体的概念 使几个不同类型的变量共占同一段内存的结构。 共用体类型的定义形式 unl on 共用体名 数据类型1 变量名1: 数据类型2 变量名2 数据类型n 变量名n 、共用体变量的引用 共用体变量名.成员名 共用体变量的特点 同一内存段瞬时只能存放成员表中的一种,此时其他成员不起作用 共用体变量的地址及各成员的地址相同 &a、&a.i、&a.ch、&a.f均是同一地 不能用共用体变量名进行赋值、初始化等操作:如 union int i: char ch: float f: a=1, 'a', 1.51: X 共用体与结构体可以嵌套使用
联合(共同体)也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同 的数据类型,因为有时我们需要使几种不同类型的变量放到同一内存单元中。允许利用同一存储区域 来存储、处理不同类型的数据。例如:学校的教师和学生所填一个表格。其中,职业一项分为“教 师”和“学生”两类。对“单位”一项,学生填入班级编号,而教师则应填入某系某教研室。班级可 用整型量表示,而某系某教研室只能用字符串型。要求把这两种类型不同的数据均填入“单位”这个 变量中,就必须把“单位”定义为包含整型量和字符数组这两种类型的联合(共同体)。这种使几个 不同的变量共占同一段内存的结构,称为“联合”(共同体)类型的结构。 一、共用体的概念 使几个不同类型的变量共占同一段内存的结构。 共用体类型的定义形式: union 共用体名 { 数据类型 1 变量名 1; 数据类型 2 变量名 2; … … 数据类型 n 变量名 n; }; 二、共用体变量的引用 共用体变量名.成员名 如: a.i 或 a.f 三、共用体变量的特点 同一内存段瞬时只能存放成员表中的一种,此时其他成员不起作用; 共用体变量的地址及各成员的地址相同; 即 &a、&a.i、&a.ch、&a.f 均是同一地址。 不能用共用体变量名进行赋值、初始化等操作;如: union { int i; char ch; float f; }a={1,’a’,1.5}; × 共用体与结构体可以嵌套使用
不能用共用体变量作为函数参数,也不能使函数带回共用体变量,但可用指向共用体 变量的指针作函数的参数 枚举 5.6枚举 、枚举类型的概念 列举出所有可能的取值的一种数据结构。 、枚举类型的定义 enum枚举名 枚举值表} B: enum weekday (sun, mon, tue, wed, thu, fri, sath enum weekday week_ end, workday oX enum weekday[sun, mon, tue, wed, thu, fri, sat workda ni enum Isun, mon, tue, wed, thu, fri, sat week end; 、枚举类型变量的赋值和使用 枚举值是常量,不是变量 枚举类型是有序数据类型,枚举元素是有值的 i enum weekday [sun, mon, tue, wed, thu, fri, sat )a,b,c
不能用共用体变量作为函数参数,也不能使函数带回共用体变量,但可用指向共用体 变量的指针作函数的参数。 枚举 5 . 6 枚举 一、枚举类型的概念 列举出所有可能的取值的一种数据结构。 二、枚举类型的定义 enum 枚举名 { 枚举值表 }; 例:enum weekday{sun, mon, tue, wed, thu, fri, sat}; enum weekday week_end, workday; 或 enum weekday{sun,mon,tue,wed,thu,fri,sat}workday; 或 enum {sun,mon,tue,wed,thu,fri,sat}week_end; 三、枚举类型变量的赋值和使用 1. 枚举值是常量,不是变量; sun=5; mon=2; sun=mon; × 2. 枚举类型是有序数据类型,枚举元素是有值的; 例:main( ) { enum weekday {sun, mon, tue, wed, thu, fri, sat }a,b,c;