C语言-结构体与共用体

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

结构变量在内存中的起始地址称为结构变量的指针。 [例] 使用指向结构变量的指针来访问结构变量的各个成员。 #include“struct.h” struct std_info student={“000102”,“张三”,“男”,{1980,9,20}}; main() { struct std_info *p_std=&student; printf("No: %s\n", p_std->no); printf("Name: %s\n", p_std->name); printf("Sex: %s\n", p_std->sex); printf("Birthday: %d-%d-%d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); }
struct date /*日期结构类型:由年、月、日三 项组成*/ {int year; int month; int day; }; struct std_info /*学生信息结构类型:由学号、 姓名、性别和生日共4项组成*/ {char no[7]; char name[9]; char sex[3]; struct date birthday; }; struct score /*成绩结构类型:由学号和三门成 绩共4项组成*/ {char no[7]; int score1; int score2; int score3; };
2、在声明类型的同时定义变量 如: struct student { int num; char name[20]; int age; float score; char addr[40]; } student1,student2; 这种形式的定义为: struct 结构体名 { 成员列表} 变量名列表 ;
通过指向结构体变量的指针来访问结构体变量的成 员,与直接使用结构体变量的效果一样。一般地说, 如果指针变量pointer已指向结构体变量var,则以下 三种形式等价:
(1)var.成员 (2)pointer->成员 (3)(*pointer).成员 省!*/
/* “*pointer”外面的括号不能
11.5
结构体数组
结构数组的每一个元素,都是结构类型数据,均包含 结构类型的所有成员。
百度文库
11.5.1 定义结构体数组
上例中定义的结构类型struct std_info,定义一个结构 数组student,用于存储和显示三个学生的基本情况。
#include"struct.h" /*定义并初始化一个外部结构数组student[3] */ struct std_info student[3]={{“000102”,“张三”,“男”,{1980,9,20}}, {“000105”,“李四”,“男”,{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} };
注意:在格式(1)中,分量运算符左侧的运算对 象,只能是结构体变量;而在格式(2)中,指向运算 符左侧的运算对象,只能是指向结构体变量(或结构 体数组)的指针变量,否则都出错。
思考题:如果要求从键盘上输入结构体变量student的各成 员数据,如何修改程序?
11.6.2 指向结构体数组的指针
[例]使用指向结构体数组的指针来访问结构体数组。
/*打印内容*/ for( ; i<3; i++) { display( student + i ); printf("\n"); } } void display(struct std_info *p_std) { printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); }
注意: 如果指针变量p已指向某结构体数组,则 p+1指向结构体数组的下一个元素,而不是 当前元素的下一个成员。 另外,如果指针变量p已经指向一个结构 体变量(或结构体数组),就不能再使之指 向结构体变量(或结构体数组元素)的某一 成员。
11.6.3 用结构体变量和指向结构体的指针作函 数参数
[例] 用函数调用方式,改写上例:编写一个专门的显 示函数display(),通过主函数调用来实现显示。
结构变量的引用
#include“struct.h” /*定义并初始化一个外部结构变量student */ struct std_info student={“000102”,“张 三”,“男”,{1980,9,20}}; main() { printf("No: %s\n",student.no); printf("Name: %s\n",student.name); printf("Sex: %s\n",student.sex); printf("Birthday: %d-%d-%d\n",student.birthday.year, student.birthday.month, student.birthday.day); }
(1)“结构类型名”和“数据项”的命名规则,与变量 名相同。 (2)数据类型相同的数据项,既可逐个、逐行分别定义, 也可合并成一行定义。 例如,上例中的日期结构类型,也可改为如下形式: struct date {int year, month, day; }; (3)结构类型中的数据项,既可以是基本数据类型,也 允许是另一个已经定义的结构类型。 例如,上例中的结构类型std_info,其数据项“birthday” 就是一个已经定义的日期结构类型date。 (4)本书将1个数据项称为结构类型的1个成员(或分 量)。
程序运行结果: No. Name 000102 张三 000105 李四 000112 王五
Sex 男 男 女
Birthday 1980-9-20 1980-8-15 1980-3-10
与结构变量的定义相似,结构数组的定义也 分直接定义和间接定义两种方法,只需说明为 数组即可。
11.5.2
结构体数组的初始化
如果某成员本身又是一个结构类型,则只能通过 多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为: 结构变量.成员.子成员.….最低1级子成员 例如,引用结构变量student中的birthday成员 的格式分别为: student.birthday.year student.birthday.month student.birthday.day (1)对最低一级成员,可像同类型的普通变量 一样,进行相应的各种运算。 (2)既可引用结构变量成员的地址,也可引用 结构变量的地址。例如,&student.name ,&student 。
#include “struct.h“ /*定义并初始化一个外部结构体数组student */ struct std_info student[3]={{"000102","张三","男",{1980,5,20}}, {"000105","李四","男",{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} }; main() { struct std_info *p_std=student; int i=0; /*打印表头*/ printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出结构数组内容*/ for( ; i<3; i++, p_std++) { printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); } }
11.4
结构体变量的初始化
结构体变量初始化的格式,与一维数组相似: 结构变量={初值表} 不同的是:如果某成员本身又是结构类型,则 该成员的初值为一个初值表。 如上例中的
student={“000102”,“张三”,“男”,{1980,9,20}};
注意:初值的数据类型,应与结构变量中相应
成员所要求的一致,否则会出错。
与普通数组一样,结构数组也可在定义时进行初始化。 初始化的格式为: 结构数组[n]={{初值表1},{初值表2},...,{初值 表n}} 例如,上例中的结构数组student[3]。 11.5.3 结构体数组应用举例 请同学看教材287页的例子。
11.6
11.6.1
指向结构体类型数据的指针
指向结构体变量的指针
第11章 结构体与共用体 11.1 概述
C 语言中的结构类型,相当于其它高级语言中的“记 录”类型。
声明一个结构体类型的一般形式为: struct 结构体名 { 成员表列 } 如:
struct date /*日期结构类型:由年、月、日三 项组成*/ { int year; int month; int day; };
/*主函数main()*/ main() { int i; /* 打 印 表 头 : " □" 表 示 1 个 空 格 字 符 * / printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出三个学生的基本情况*/ for(i=0; i<3; i++) { printf("%-7s",student[i].no); printf("%-9s",student[i].name); printf("%-4s",student[i].sex); printf("%d-%d-%d\n",student[i].birthday.year, student[i].birthday.month, student[i].birthday.day); } }
#include "struct.h" /*定义并初始化一个外部结构数组student */ struct std_info student[3]={{"000102","张三","男",{1980,5,20}}, {"000105","李四","男",{1980,8,15}}, {“000112”,“ 王 五”,“女”,{1980,3,10}} }; /*主函数main()*/ main() { void display(); /*函数说明*/ int i=0; /*打印表头*/ printf("No.□□□□Name□□□□□Sex□Birthday\n");
3、直接定义结构体类型变量 其一般形式为: struct { 成员表列 } 变量名表列; 即不出现结构体名。 说明: (1)结构类型与结构变量是两个不同的概念,其区 别如同int类型与int型变量的区别一样。 (2)结构类型中的成员名,可以与程序中的变量同 名,它们代表不同的对象,互不干扰。
11.3
结构体变量可以用下面三种方法进行定义: 1.先声明结构体类型再定义变量名 与系统定义的标准类型(int、char等)一样,可 用来定义结构变量的类型。 如:上例中定义的学生信息结构类型std_info, 定义一个相应的结构变量student: struct std_info student; 则结构变量student拥有结构类型的全部成员,其 中birthday成员是一个日期结构类型,它又由3个成 员构成。 注意:使用该种方法定义结构变量时,必须指定 结构类型名。
程序运行结果: No: 000102 Name: 张三 Sex: 男 Birthday:1980-9-20
结构变量的引用规则: 对于结构变量,要通过成员运算符“.”,逐个访 问其成员,且访问的格式为: 结构变量.成员 /*其中的“.”是成员运算符*/ 例如上例中的student.no,引用结构变量student 中的no成员;student.name引用结构变量student中 的name成员;等等。
11.2
定义结构体类型变量的方法
声明一个结构体类型的一般形式: struct 结构类型名 /* struct是结构类型关键字*/ {数据类型 数据项1; 数据类型 数据项2; …… …… 数据类型 数据项n; }; /* 此行分号不能少!*/
如:定义一个反映学生基本情况的结构类型,用以存储 学生的相关信息。 /*功能:定义一个反映学生基本情况的结构类型*/
相关文档
最新文档