第8章_结构体及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主要内容
结构体类型与结构体变量
指针结构体的指针 向函数传递结构体 结构体数组
动态数据结构——单链表
8.1 为何要用结构体
学号 姓名 年龄 身份证号 家庭住址
家庭电话 班级名称
性别
C语言中学习的基本数据类型
都不能独立地来表示这些对象 的全部属性。
退出
8.2 结构体类型与结构体变量 8.2.1 结构体类型的声明
学号 id 姓名 name 年龄 age 性别 sex 身份证号 sfzh
wenku.baidu.com退出
//学号 //姓名 //年龄 //性别 //身份证号 //家庭住址 //电话号码 //班级名称
家庭住址 address 电话号码 telNumber 班级名称 className
• 结构体类型的定义可以嵌套,即可以利用一个已定 义的结构体类型作为别外一个结构体类型的属性。
退出
【例8.1】结构体类型定义及结构体变量的定义与初始化示例。 struct student { char id[13]; char name[9]; struct date birthday; char sex; char sfzh[19]; char address[61]; char telNumber[12]; char className[21]; };
退出
如: • typedef struct student stuStru; • //将 struct student命名为stuStru • 之后,便可在程序中使用stuStru等价地表示 struct student。 例如: • stuStru s1,s2; • 定义了两个学生结构体变量 s1和s2 。
高等学校精品资源共享课程(省级) 省级教学成果一等奖建设教材
高级语言程序设计
揭安全
jieanquan@163.com 江西师范大学计算机信息工程学院
高等学校精品资源共享课程(省级) 省级教学成果一等奖建设教材
第8章 结构体及其应用
揭安全
jieanquan@163.com 江西师范大学计算机信息工程学院
退出
注意事项:
( 4)两个同类型的结构体变量可以直接赋值, 赋值号右边结构体变量的成员将依次赋值给左 边结构体变量的各个成员。 例如: • s2=s1; • 将使 s2与s1具有相同的属性值。
退出
8.2.4 结构体变量的初始化
结构体变量可以在声明时进行初始化,变量后 面的一组数据用“{}”括起来,其顺序应该与结 构体中的成员(属性)顺序保持一致,且对应 的类型应赋值相容。
退出
【例8.1】结构体类型定义及结构体变量的定义与初始化示例。 printf("出生日期 :%d-%d-%d\n",s2.birthday.year, s2.birthday.month, s2.birthday.day); printf("性 别 :%s\n",s2.sex=='M'?"男 ":"女 "); printf("身份证号 :%s\n",s2.sfzh); printf("家庭住址 :%s\n",s2.address); printf("电话号码 :%s\n",s2.telNumber); printf("班级名称 :%s\n",s2.className); return 0; }
【例8.2】结构体变量传值调用示例。 #include <stdio.h> struct date { int year; int month; int day; };
退出
void fun(struct date d) { d.year=2008; d.month=8; d.day=8; } 2014-9-1 int main() 2014-9-1 { struct date d={2014,9,1}; printf("%d-%d-%d\n",d.year,d.month,d.day); fun(d); //传值调用 printf("%d-%d-%d\n",d.year,d.month,d.day); return 0; }
退出
当结构体指针指向某结构体变量后,借助指针有 两种方式来访问该指针指向的对象属性。 ( 1)通过“(*指针).属性名”来访问指针指向的对 象的属性。
例如,若p为指向结构体变量s的指针,则: scanf("%d", &(*p).birthday.year ); printf("%s", (*p).name ); 分别完成p指向对象的出生年份的输入和姓名的输 出。
例如: stuStru s1={"201400120001","李明 ",{1996,10,20},'M',"36010119961020****","南昌市东湖区 ", "","物联网1班"};
退出
【例8.1】结构体类型定义及结构体变量的定义与初始化示例。 #include <stdio.h> struct date { int year; int month; int day; };
退出
学 号 :201400120001 姓 名 :李明 出生日期 :1996-10-20 性 别 :男 身份证号 :36010119961020**** 家庭住址 :南昌市东湖区 电话号码 : 班级名称 :物联网1班
退出
8.3 指向结构体的指针
结构体指针变量的定义格式如下: 结构体类型名 *指针变量名; 例如,对例8.1定义的结构体类型stuStru,可以 定义结构体变量和指针变量: stuStru s, *p; p=&s;将使指针p保存s的首地址。
struct date { int year; int month; int day; };
退出
• 结构体类型的定义可以嵌套,即可以利用一个已定 义的结构体类型作为别外一个结构体类型的属性。
struct student { char id[13]; char name[9]; struct date birthday; char sex; char sfzh[19]; char address[61]; char telNumber[12]; char className[21]; }; //学号 //姓名 //生日 //性别 //身份证号 //家庭住址 //电话号码 //班级名称
注意:s1.id="201400120001"是错误的。
退出
注意事项:
( 2)对于嵌套的结构体变量,应该逐级访问其 成员,直至非结构体成员。 如: • s1.birthday.year=1996; • s1.birthday.month=10; • s1.birthday.day=20; • 完成将s1的生日设置为1996年10月20日。
结构体类型定义的一般格式为: struct 结构体类型名 { 数据类型 属性 1; 数据类型 属性 2; … 数据类型 属性 n; };
退出
例如,
struct student { char id[13]; char name[9]; int age; char sex; char sfzh[19]; char address[61]; char telNumber[12]; char className[21]; };
当 p指向的动态结构体使用完成后,应采用 free(p);语句来将该空间释放。
退出
8.4 向函数传递结构体
8.4.1 值传递
传值调用为单向值传递,函数调用发生时,系 统将结构体变量的值拷贝一份给形式参数,在 函数中所有的操作都是针对形式参数进行的, 实际参数的值不会因形参值的改变而改变。
退出
退出
2、结构体变量占用的字节数 • 结构体中的成员按定义顺序占用连续的存储空间。 • 每个结构体变量占用的字节数至少需等于所有成 员(属性)占用的内存之和。 • 我们可以用sizeof运算符来获得结构体变量占用 的字节数。 • sizeof(stuStru); • 或 • sizeof(s1);
退出
8.2.3 对结构体变量的操作
• 对结构体变量的操作应以其属性为基本单位, 具体格式如下: • 结构体变量名 .成员名 • 其中 “.”运算符为成员运算符。 例如: • stuStru s1,s2; • 则 s1.id表示s1的学号, s1.name表示s1的 姓名等。
退出
注意事项:
( 1)在访问结构体变量的成员时,要根据结 构体变量的成员类型来进行相应的操作。 例如: • strcpy(s1.id, "201400120001"); 可将 "201400120001"存入s1的学号。
1
2
15级网络工程
15级网络工程
退出
//学号 //姓名 //生日 //性别 //身份证号 //家庭住址 //电话号码 //班级名称
【例8.1】结构体类型定义及结构体变量的定义与初始化示例。 typedef struct student stuStru; int main() { stuStru s1={"201400120001"," 李明 ",{1996,10,20},'M',"36010119961020****"," 南昌市东湖区", "","物联网1班"}; stuStru s2; s2=s1; //结构体变量赋值 printf("学 号 :%s\n",s2.id); printf("姓 名 :%s\n",s2.name);
退出
注意事项:
( 3)不能将结构体变量作为一个整体进行输入 输出,只能对变量中的各个成员输入输出。 例如: • gets(s1.name); //输入 s1的姓名 • printf("%s", s1.name); //输出 s1的姓名 • scanf("%d", &s1.birthday.year); //输入 s1的出生年份 • printf("%d", s1.birthday.year); //输出 s1的出生年份
退出
8.4.2 地址传递
当函数的形参为指向结构体变量的指针类型时, 可以将结构体变量的地址作为函数的实参,完 成结构体变量的按地址调用。
退出
【例 8.3】结构体变量传地址调用示例。
#include <stdio.h> struct date { int year; int month; int day; };
退出
如果结构体变量只想被函数引用,而不想被其修 改,可以用const修辞函数的形参声明。 如: void fun(const struct date *p) 则在程序中只能访问p指向的结构体变量,而不 能对它进行修改。
退出
8.5 结构体数组
序号 0 班级名称 15级网络工程 姓名 聂 ** 学号 1508066001
退出
( 2)通过“指针->属性名”来访问指针指向的对象 的属性(->运算符由减号 -和大于号 >组合而成)。 当 p为指向结构体变量 s的指针时
p->birthday.year可引用s的出生年份 即 s.birthday.year; p->name可引用 s.name。
退出
特别地,当p为结构体类型的指针时,可以通 过 malloc函数来为 p动态分配结构体空间,如: stuStru *p; p=(struStru *) malloc ( sizeof (stuStru) );
退出
void fun(struct date *p) { p->year=2008; p->month=8; p->day=8; } 2014-9-1 int main() 2008-8-8 { struct date d={2014,9,1}; printf("%d-%d-%d\n",d.year,d.month,d.day); fun(&d); //传地址调用 printf("%d-%d-%d\n",d.year,d.month,d.day); return 0; }
退出
8.2.2 结构体变量的定义
1、结构体变量定义的格式 • 例如,我们可以利用之前已定义好的 struct student结构体类型来声明学生结构体变量。 • struct student s1,s2;
• 注意:结构体类型的完整名称为 struct student。 • 为方便书写,我们可以用类型定义符 typedef将 struct student命名为一个新的名称。