c语言第10章_结构体及共用体

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
青岛大学软件技术学院
第10章 结构体与共用体
结构体 共用体 枚举类型
第10章 结构体与共用体
10.1 概述 10.2 定义结构体类型变量的方法 10.3 结构体类型变量的引用 10.4 结构体变量的初始化 10.5 结构体数组 10.6 指向结构体类型数据的指针 10.7 链表处理──结构指针的应用 10.8 共用体 10.9 枚举类型 10.10 用typedef 定义类型
青岛大学软件技术学院
例10.3(续)
Strcpy(stu_1.name,"Li Lin"); stu_1.sex='M'; stu_1.score=89.5; printf ("No.: %ld\nname:%ssex:%c\nscore:%f\n",
stu_1.num,stu_1.name,stu_1.sex,stu_1.score); printf ("No.: %ld\nname:%ssex:%c\nscore:%f\n",
10101
数组各元素在内存中连续存放
“LiLin” ‘M’
18
stu[0]
87.5
“103 Beijing Road”
10102
stu[1]
“zhangyi” ‘M’
19Βιβλιοθήκη Baidu
...
青岛大学软件技术学院
struct student {long int num; char name[20]; char sex; char addr[30]; }stu[3]={{89031,”Li Lin”,’M’,”123 Beijing Road”},{10102,”Zhangyi”,…}, {10103,…}};
注: 先使p指向数组stu的起始地址,并于第一个循环输
出stu[0]的各个成员. 然后p+1意味着增加的地址值为结构体类型数组stu
的一个元素所占的字节数
青岛大学软件技术学院
注意区别:
(++p)->num (p++)->num p已定义为指向struct student类型的数据: p=stu;正确(数组名) p=&stu.name;错误(不能指向结构体成员) p=(struct student *)&stu.name
“.”的优先级最高
青岛大学软件技术学院
正确使用: scanf(“%d”,&student1.num); printf(“%o”,&student2);
不正确使用: scanf(“%d%s%c%d%f%s”,&student1);
青岛大学软件技术学院
struct student
No. :89031
“Li Lin” stu.name (*p).name p->name
‘M’
stu.sex (*p).sex p->sex
89.5
stu.score (*p).score p->score
分析以下几种运算:
p->n
++p->n 先加1后使用值
p->n++ 使用值后加1
青岛大学软件技术学院
10.6.2指向结构体数组的指针
2.对结构体中的成员,可以单独使用,它的作用与地位相当于普通变
量.
3.成员也可以是一个结构体变量。如:
Struct student
struct date
{int num;
{ int month;
int day;
int year;
} 4.成员名可以与程序中
的变量名相同
char name[20]; char sex; int age; struct date birthday; char addr[30];
No. :89031
{long int num; char name[20]; char sex; char addr[30];
name:Li Lin sex: M address: 123 Beijing Road
}a={89031,"Li Lin",'M',"123 Beijing Road"};
例10.2 指向结构体数组的指针 struct student {int num; char name[20]; char sex; int age;}; struct student stu[3]={{10101,"Li Lin",'M',18},(10102,"Zhang
Fun",'M',19},{10104, "Wang Min",'F',20}}; main(); {struct student *p; printf ("No. Name sex age\n");
青岛大学软件技术学院
直接定义结构体类型变量
struct {int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;
青岛大学软件技术学院
说明:
1.类型与变量是不同的, 变量可以赋值,存取和运算。对类型是不 分配空间的.
青岛大学软件技术学院
stu[0] stu[1]
num name sex 10101 LiLin M 10102 Zhangyi M
age 18 19
score
ddr
87.5 103 Beijing Road
99 130 Shanghai Road
stu[2] 10103 Wanger F 20 78.5 1010 Jinan Road
num,a.name,a.sex,a.addr);}
青岛大学软件技术学院
方法1:
方法2:
方法3:
struct student
struct student struct
{int num;
{int num;
{int num;
char name[20];
char name[20]; char name[20];
(*p).num,(*p).name,(*p).sex,(*p).score); }
三种等价形式: 1、结构体变量.成员名 ;2、(*p).成员名;3、p->成员名
青岛大学软件技术学院
struct student stu; struct student *p; p=&stu;
指向运算符
p
89101 stu.num (*p).num p->num
青岛大学软件技术学院
10.6指向结构体类型数据的指针
一个结构体变量的指针就是该变量所占据的内存段 的起始地址,可以设一个指向一个结构体变量的指针 变量
指向结构体变量的指针 指向结构体数组的指针 用指向结构体的指针作函数参数
继续
青岛大学软件技术学院
先声明结构体类型再定义变量名
如上面已定义的结构类型struct student,
char sex;
char sex;
char sex;
int age;
int age;
int age;
float score;
float score; float score;
char addr[30];
char addr[30]; char addr[30];
};
}stu[3];
}stu[3];
struct student stu[3];
可以用它来定义变量:
变量名
struct student student1, student2;
注意: 定义标准类型变量和定义结构体类型变量不同
前者类型是已知的(如int,float),而后者要先定义类型后 定义变量
人们通常用一个符号常量代表一个结构体类型 #define STUDENT struct student
} student1,student2;
青岛大学软件技术学院
(1)不能将结构体变量作为整体进行输入输出。
printf(“%d,%s,%c,%d,%f,%s\n”,student1);
引用方式:结构体变量名.成员名。如:
成员名
student1.num


结构体变量名
运 算

青岛大学软件技术学院
如果成员本身又是一个结构体类型,则要用成 员运算符一级一级地找到最低一级的成员
青岛大学软件技术学院
在声明类型的同时定义变量
struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;
变量名列表
青岛大学软件技术学院
定义的一般形式为: struct 结构体名 { 成员表列 } 变量名表列
青岛大学软件技术学院
例10.2 续
for (p=stu;p<stu+3; p++) printf ("%5d %-20s %2c %4d\n",p->num, p-
>name,p->sex;p->age); }
p
青岛大学软件技术学院
已有一个结构体数组: struct student stu[4]={...}; 再定义一个指针变量: struct student *p; p=stu; 如: for (p=stu;p<stu+3;p++) printf(“%5d,%-20s,%2c,%4d”,p->num, p->name,p->sex,p->age);
说 明 不能将一个结构体变量作为一个
整体进行输入输出
只能对最低级的成员进行赋值或 存取以及运算
对成员变量可以象普通变量一样 进行各种运算
可以引用成员的地址,也可以引用 结构体变量的地址
青岛大学软件技术学院
10.4 结构体变量的初始化
下面给出的是结构体变量的初始化实例
struct student
青岛大学软件技术学院
•10.1 概述
有时需要将不同类型的数据组合成一个有机的整体 以便于引用,如: 一个学生的学号,姓名,性别,年龄,成绩,地址等.分别定 义简单变量难以反映它们之间的联系.
应当将它们组成一个组合项,其中可以包含若干个类 型不同的数据项.
C提供的结构体相当于记录
青岛大学软件技术学院
关键字 不能省略
struct student
结构体名,和标准类型 名一样可以定义变量
{int num;
char name[20];
char sex; int age; float score;
成员列表,每个成员又称 分量或域. 成员名定名规则与变量同
char addr[30];
};
作为语句,必须以分号结束
struct date {int month; int day; int year; };
struct student 正确引用:
{int num;
student1.num
char name[20]; student1.birthday.day
char sex;
int age;
struct date birthday;
main()
{printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.
num,a.name,a.sex,a.addr);}
青岛大学软件技术学院
10.5结构体数组
结构体数组与以前介绍的数值型数组不同之 处在于每个数组元素都是一个结构体类型 的数据
10.5.1 结构体数组的定义 10.5.2 结构体数组的初始化 10.5.3 举例:对候选人得票的统计程序.
青岛大学软件技术学院
声明一个结构体类型的一般形式
struct 结构体名 {成员表列}; 类型名 成员名
青岛大学软件技术学院
10.2定义结构体类型变量的方法
1.先定义结构体类型再定义变量名 2.在定义类型的同时定义变量 3.直接定义结构体类型变量
青岛大学软件技术学院
10.3结构体类型变量的引用
char addr[30];
}student1,student2;
青岛大学软件技术学院
student2.score=student1.score; sum=student1.score+student2.score; student1.age+ +; + +student2.birthday.year;
{long int num; char name[20]; char sex;
name:Li Lin sex: M
char addr[30];
address: 123 Beijing Road
}a={89031,"Li Lin",'M',"123 Beijing Road"};
main()
{printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.
青岛大学软件技术学院
例10.3 指向结构体变量的指针
#include <string.h> main() {struct student
{long num; char name[20]; char sex; float score; }; struct student stu_1; struct student *p; p=&stu_1; stu_1.num=89101;
相关文档
最新文档