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

结构体


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

10.1.2结构体变量的定义

10.1 结构体

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

10.2 共用体

10.1.6 结构体指针

1

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


相关文章:
31-结构体变量定义与输入输出
二.结构体变量的定义 结构体 (1)间接定义法——先定义结构类型,再定义结构体变量 struct stu_info { …… }; struct stu_info stu1,stu2; (2)直接定义法...
计算机二级C语言结构体要点
成员名 (2)(*p).成员名 (3)p->成员名 2.指向结构体数组的指针 注意: (1)p=stu;,则 p++指向 stu[1] (2)运算符“->”优先于“++”运算符 ++p...
定义多个结构体
定义多个结构体_数学_自然科学_专业资料。定义多个结构体 #include<stdio.h> #include<malloc.h> struct Weather{ int temp; int day; int outdoor; struct ...
结构体的指针应用
简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己 定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声 明...
结构体的嵌套问题
结构体嵌套的问题 作者: likefreebird 时间: 2010-05-24 12:00:00 指针变量非常灵活方便,可以指向任一类型的变量,若定义指针变量指向结构体类型变 量,则可以...
实验8_结构体
《C 语言程序设计》实验报告实验序号:8 学号姓名 实验项目名称:结构体 专业、班级 实验时间 实验地点 一、实验目的及要求 指导教师 1、掌握结构体变量的定义和...
C51的结构体数据在单片机编程中的应用
使用 C51 编译支持的一种结构体(struct)数据类 型,可有效地解决许多编程中所面临的种种数据结构管理问题。 1 结构体数据 除了基本类型数据, 数组是 C51 编程中...
函数与结构体
加深对结构的理解,下面编写几个用于对点和矩形进行操作的函数 把结构体传递给函数的方式有三种:一是分别传送各个结构成员,二是传送整个结构, 三是传送指向结构的...
C51 结构体运用
C51 结构体运用_信息与通信_工程科技_专业资料。C51 结构体运用c51 中定义联合体和结构体 C51 单片机 2009-06-09 16:39:14 阅读 319 评论 1 字号:大中小 订...
土壤结构体的类型
土壤结构体的类型土壤结构体(图 4)依其形态,大小和特性可分为: 图4 块状结构体(block structure) 块状结构体属于立方体型,其长,宽,高三轴大体近似,边 面棱...
更多相关标签: