当前位置:首页 >> 其它课程 >>

结构体


第10章 结构体与共用体
10.1.1 结构体概述

10.1.2结构体变量的定义

10.1 结构体

10.1.3 结构体变量的引用 10.1.4 结构体变量的初始化 10.1.5 结构体数组

10.2 共用体

10.1.6 结构体指针

1<

br />
10.1.1 结构体概述
结构体是一种构造数据类型 ? 用途:把不同类型的数据组合成一个 整体-------自定义数据类型 ? 结构体类型定义 合法标识符
?

struct是关键字, 不能省略

struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. };

可省:无名结构体 成员类型可以是 基本型或构造型

2

例子图解
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };

num

2字节

… …..

name sex age score

20字节 1字节 2字节 4字节

addr

30字节

结构体类型定义的作用域

结构体类型定义描述结构 的组织形式,不分配内存

3

10.1.2 结构体变量的定义
1 先定义结构体类型,再定义结构体变量
? 一般形式:

struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 变量名表列;
4

2、定义结构体类型的同时定义结构体变量
一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;

例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;

5

3、直接定义结构体变量
一般形式: struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列; 用无名结构体直接定义 变量只能一次

例 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;

6

说明: 结构体类型与结构体变量概念不同

类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套

7

10.1.3 结构体变量的引用
?

引用规则 ? 结构体变量不能整体引用,只能引用变量成员

引用方式:

结构体变量名.成员名
成员(分量)运算符 优先级: 1 结合性:从左向右

可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用
8

10.1.4 结构体变量的初始化
?

形式一: struct
{

结构体名

类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 结构体变量={初始数据}; 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,?M?,19, “200 Beijing Road”}; 9

结构体变量的初始化形式二:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据};

例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,?M?,19, “200 Beijing Road”};
10

结构体变量的初始化形式三:
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据}; 例 struct { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,?M?,19, “200 Beijing Road”};
11

10.1.5 结构体数组
1、结构体数组的定义的三种形式:
形式一: struct student 形式二 : { int student num; struct 形式三 : name[20]; char { int num; struct char char sex; name[20]; { int num; int age; char sex; name[20]; }; char int age; char sex; stu[2]; struct student }stu[2]; int age; }stu[2];
num 25B name sex age num name sex age stu[1] stu[0]

12

2、结构体数组初始化及引用

引用方式: 结构体数组名[下标].成员名
例 struct stu[1].age++; { int num; char name[20]; struct student { char intsex; num; int char age; name[20]; }stu[ ]={{……},{……},{……}}; char sex; int age; }str[3]; strcpy(stu[0].name,”ZhaoDa”);

13

例 统计后选人选票
struct person name { char name[20]; Li int count; Zhang }leader[3]={“Li”,0,“Zhang”,0,”Wang“,0}; main() Wang { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)= =0) leader[j].count++; } for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); }
count 0

0 0

14

10.1.6 结构体和指针
指向结构体变量的指针
定义形式:struct 结构体名 *结构体指针名;
例 struct student *p;

存放结构体变量在内存的起始地址 struct student { int num; char name[20]; char sex; int age; }stu; struct student *p=&stu;
p

num name sex age

stu

例 指向结构体的指针变量
15

使用结构体指针变量引用成员形式 例 int n; int *p=&n; *p=10; ? n=10
(*结构体指针名).成员名

struct student stu1; struct student *p=&stu1; stu1.num=101; ? (*p).num=101
结构体变量名.成员名

结构体指针名->成员名

指向运算符 优先级: 1 结合方向:从左向右

16

思考:右图如何通过语句实现?
元素/结点 元素/结点 元素/结点

9901

9910

9950

struct student { int num; float aver; stu1.num=9901;stu1.aver=89.5; struct student *next; }; stu2.num=9910;stu2.aver=90; student stu1,stu2,stu3,*p; stu3.num=9950;stu3.aver=97.5; stu1.next=&stu2;stu2.next=&stu3; p=&stu1;

89.5

90

97.5

/* next 是指向该结构体类型的指针变量, 用来存放下一个结点的起始地址,实现将各结点连接成链 */
17

10.2 共用体
?构造数据类型,也叫联合体
?用途:使几个不同类型的变量共占一段内存(相互覆盖)
?

1 共用体类型定义
定义形式:
union 共用体名 {

类型标识符 成员名; 类型标识符 成员名; …………….

例 union data { int i; char ch; float f; };

}; i 类型定义不分配内存

ch f
18

共用体变量的定义
形式一: union data { int i; char ch; float f; }a,b;
i ch f

形式二: union data { int i; char ch; float f; }; union data a,b,c,*p,d[3];
i ch f

形式三: union { int i; char ch; float f; }a,b,c;

a
共用体变量任何时刻 只有一个成员存在

b
共用体变量定义分配内存, 长度=最长成员所占字节数

19

2 共用体变量引用
引用方式: 共用体变量名.成员名 共用体指针名->成员名
(*共用体指针名).成员名

union data a.i a.ch a.f { int i; p->i p->ch p->f char ch; float f; (*p).i (*p).ch (*p).f }; union data a,b,c,*p,d[3]; d[0].i d[0].ch d[0].f

20

引用规则 不能引用共用体变量,只能引用其成员 例 union { int i; char ch; float f; }a; a=1; ( ?)

共用体变量中起作用的成员是最后一次存放的成员
例 a.i=1; a.ch=?a?; a.f=1.5; printf(“%d”,a.i);

(?编译通过,运行结果不对)
21

可以用一个共用体变量为另一个变量赋值
例 float x; union { int i; char ch; float f; }a,b; a.i=1; a.ch=?a?; a.f=1.5; b=a; (?) x=a.f; (?)

不能在定义共用体变量时初始化
例 union { int i; char ch; float f; }a={1,?a?,1.5};

( ?)
22

小结:结构体与共用体
区别: 存储方式不同

联系: 两者可相互嵌套
struct node { char ch[2]; int k; }a; union node { char ch[2]; int k; }b;
变量的各成员同时存在

ch k

a

ch k

b
任一时刻只有一个成员存在

23

(49)设有如下定义: struct sk {int a;float b;}data,*p; 若有p=&data;,则对data中的a域的正确引用是 A)(*p).data.a C)p->data.a B)(*p).a D)p.data.a
24

有以下说明和定义 C union dt {int a;char b;float c;}data; 以下叙述中错误的是
A)data的每个成员起始地址都相同 B)变量data所占的内存字节数与成员c所占字节数相 等 C)程序段:data.a=5;printf(“%f\n”,data.c);输出结果 为5.000000 D)data占用4个字节的内存单元
25


相关文章:
C语言中结构体变量和结构体类型的定义
1.结构体类型定义 定义方式 1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式 2: struct LNode {...
C语言结构体实验报告
《高级语言程序设计》实验报告实验序号:8 学号姓名 实验项目名称:结构体 专业、班级 实验时间 实验地点 一、实验目的及要求 指导教师 1、掌握结构体变量的定义和...
C语言中结构体的使用
C语言中结构体的使用_计算机软件及应用_IT/计算机_专业资料。脚踏实地,心无旁骛,珍惜分分秒秒。紧跟老师,夯实基础。 什么是结构体? 简单的来说 结构体就是一...
计算机二级C语言结构体要点
成员名 (2)(*p).成员名 (3)p->成员名 2.指向结构体数组的指针 注意: (1)p=stu;,则 p++指向 stu[1] (2)运算符“->”优先于“++”运算符 ++p...
函数与结构体
加深对结构的理解,下面编写几个用于对点和矩形进行操作的函数 把结构体传递给函数的方式有三种:一是分别传送各个结构成员,二是传送整个结构, 三是传送指向结构的...
Stm32里经常出现的结构体
Stm32里经常出现的结构体_计算机软件及应用_IT/计算机_专业资料。Stm32 头文件里的结构体 分析Stm32 里经常出现的结构体在 c 语言中结构体有如下 Struct typenam...
C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同的结构体类型的指针间的强制转换详解_能源/化工_工程科技_专业资料。C 语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理 解了...
结构体冒号用法
一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct { 位域结构名 }; 类型说明符 位域名:位域长度 位域列表 其中位域列表的形式为: ...
第二十讲 结构体变量
第二十讲 结构体变量 1、结构体结构体类型的定义 信息管理 一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。 一本图书的信息有分类编号、书名、作者...
c语言结构体练习
[5]; //定义结构体变量数组 int main() { int i,j,k; struct mes temp; printf("请输入五位学生的信息\n"); printf("学号\t 姓名\t 数学\t 计算机...
更多相关标签:
c语言结构体 | 结构体初始化 | 结构体指针 | 结构体数组 | 结构体定义 | c++结构体 | 结构体赋值 | 中文编程 |