当前位置首页 > 办公文档 > 工作计划
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

十章结构体与共用体ppt课件

文档格式:PPT| 40 页|大小 586.02KB|积分 10|2022-03-25 发布|文档ID:65900067
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 40
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章第十章第十章 结构体与共用体结构体与共用体本章要点:本章要点: 掌握结构体和共用体类型的说明掌握结构体和共用体类型的说明 掌握结构体和共用体变量的定义及初掌握结构体和共用体变量的定义及初始化方法始化方法 掌握结构体与共用体变量成员的引用掌握结构体与共用体变量成员的引用 理解存储动态分配和释放理解存储动态分配和释放 理解链表的基本概念和基本操作理解链表的基本概念和基本操作 理解枚举类型变量的定义理解枚举类型变量的定义 了解了解 typedeftypedef 的作用的作用 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章10.1 概述概述 为了将不同类型的数据组合成一个有机的整为了将不同类型的数据组合成一个有机的整体,以便引用体,以便引用C 语言提供了一种数据结构,叫语言提供了一种数据结构,叫结结构体构体 (structure) 结构体类型声明的结构体类型声明的一般形式一般形式: struct 结构体名结构体名 成员表列成员表列 ; 存储示意图存储示意图实例实例说明说明 其中其中: struct 表示是一个表示是一个 “ 结构结构体类型体类型 ” 结构体名结构体名 同标识符规则一样。

    同标识符规则一样 成员表列成员表列 组成结构体的各成员项组成结构体的各成员项 struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; ; numname sexage scoreaddr 10010Li Fun M 18 87.5 Beijing语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章方法三、直接定义结构类型变量,方法三、直接定义结构类型变量, struct 成员表列成员表列 变量名表列变量名表列 ; 例如例如 10.2 定义结构体类型变量的方法定义结构体类型变量的方法 方法一、方法一、 先声明结构体类型再定义变量名,先声明结构体类型再定义变量名,例如例如方法二、方法二、 在声明类型的同时定义变量,在声明类型的同时定义变量,例如例如struct student student1 , student2 ; 表示表示: student1 , student2 为为 struct student 类型变量类型变量。

    定义一个结构体类型变量,不仅要求指定变量定义一个结构体类型变量,不仅要求指定变量为为结构体类型,而且要求指定为某一特定的结构体类型结构体类型,而且要求指定为某一特定的结构体类型 10010Li Fun M 18 87.5 Beijing 10011Su Li F 19 90 Shanghaistudent1student2 如如: struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; student1 , student2 ; struct int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; student 1 , student2 ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章定义结构体类型变量的几点说明定义结构体类型变量的几点说明: 1. 只能对结构体类型只能对结构体类型变量变量赋值赋值、存取存取、运算等。

    运算等而不能对结构体而不能对结构体类型类型赋值赋值、存取存取、运算等例如例如 2. 结构体变量中的成员如同普通变量一样,可以结构体变量中的成员如同普通变量一样,可以单独使用单独使用例如例如 3. 结构体的成员可以又是一个结构体变量结构体的成员可以又是一个结构体变量例如例如 4. 结构体类型中的成员名可以与普通变量名相同结构体类型中的成员名可以与普通变量名相同但二者是彼此独立的,互不干扰但二者是彼此独立的,互不干扰struct student =student1; (错误语句错误语句)student1.age=18; 如如: struct date int month ; int day ; int year ; ; struct student int num ; char name20 ; char sex ; int age ; struct date birthday ; char addr30 ; student1 , student2 ;birthdaymonth day year语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 10.3 结构体类型变量的引用结构体类型变量的引用 同普通变量一样,仍要求先定义后使用同普通变量一样,仍要求先定义后使用。

    规则如下规则如下: 一、一、 引用方式引用方式 结构体变量名结构体变量名 . 成员名成员名 其中其中: “ . ” 叫叫成员成员 ( 分量分量 ) 运算符如如: student1 . num , student1 . addr 等等语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章二、二、 引用时注意事项:引用时注意事项: (1) 不能将一个结构体变量作为一个整体进行输不能将一个结构体变量作为一个整体进行输入,输出等而只能对入,输出等而只能对结构体变量中的成员结构体变量中的成员分别进分别进 行输入行输入、输出输出、赋值等例如例如(2) 新标准新标准 C 中,可以将一个结构体变量直接赋中,可以将一个结构体变量直接赋给另一个具有给另一个具有相同结构的相同结构的结构体变量结构体变量例如例如(3)如成员本身又属另一个结构体类型则只能如成员本身又属另一个结构体类型则只能对最低级成员进行赋值对最低级成员进行赋值 ,存取和运算等存取和运算等例例如如(4)对结构体变量中的成员可以象普通变量一样对结构体变量中的成员可以象普通变量一样进行各种运算进行各种运算。

    例如例如 (5)允许使用成员和结构体变量的地址允许使用成员和结构体变量的地址例如例如 如如: printf ( “ %d, %s, %c , %d ,% f ,%s n”,student1) ; 而而: printf ( “ %s n ” , student1 . name ) ; student1 . num = 10010 ; (合法合法)student1 = student2 ; 如如: student1 . num student1 . name student1 . birthday . month 但不能用但不能用 student1 . birthday 来访问来访问 student1 中的成员中的成员birthday 因为它本身是一个结构体变量因为它本身是一个结构体变量如如: student2 . score = student1 . score ; student1 . age + + ; 等等 如如: scanf ( “ %d ”, &student1 . num ) ; printf ( “ %o” , &student1) ; (输出输出 student1 的首地址的首地址) 而而: scanf ( “%d , %s , %c , %d , % f , %s ” , &student1) ; 则不合法。

    则不合法语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 例例 10.1(p264) struct student long int num ; char name20 ; char sex ; char addr20 ; a = 89031 , “ Li Lin” , M , “123 Beijing Rood ” ; void main ( ) printf ( “ No.:%ldn name:%sn sex:%cn address:%sn”, a . num , a . name , a . sex , a . addr ) ; No: 89031 name: Li Lin sex: M address: 123 Beijing Rood10.4 结构体类型变量的初始化结构体类型变量的初始化语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章10.5 结构体数组结构体数组 所谓结构体数组,即构成数组的每一个元素都是一个结 构体类型的数据一、结构体数组的定义一、结构体数组的定义 1. struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; ; struct student stu3 ;2 . struct student int num ; . stu3 ;3 . struct int num ; . stu3 ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章103 Beijing Road130 ShanghaiRoadstu0stu1stu2stu0stu1stu2 6项项 6项项 6项项numname sex age core addr10101 Li Lin M 1887.510102 Lu Pin M 19 9510103 Wu Li W 20 85.5100 Zhongsh Road 结构体数组的元素在内存结构体数组的元素在内存 中也是中也是连续存放连续存放的的语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 二、结构体数组的初始化二、结构体数组的初始化 struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; stu3 = 10101 , “ Li Lin ”, M , 18 , 87.5 , “ 103 Beijing Road ” , 10102 , “ Zhang Fun ”,M, 19 , 95 , “ 130 Shanghai Road ” , 10101 , “Wang Min ”,F , 20 , 78, “1010 Zhongshan Road ” ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 例例 10.2 ( p266) struct person char name20 ; int count ; leader3 = “ Li ” , 0 , “ Zhang ” , 0 , “ Fun ” , 0 ; main ( ) int i , j ; char leader_name20 ; for ( i = 0 ; i = 10 ; i + + ) scanf ( “ %s ” , leader_name ) ; for ( j = 0 ; j 3 ; j + + ) if ( strcmp ( leader_name , leaderj . name) = = 0 ) leaderj . count + + ; printf ( “ %n ” ) ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 for ( i = 0 ; i num 表示指向结构体成员运算符。

    表示指向结构体成员运算符 3. 结构体变量中成员的引用有三种形式结构体变量中成员的引用有三种形式: (1) 结构体变量结构体变量 . 成员名成员名 ; (2) (*p) . 成员名成员名 ; (3) p 成员名成员名 ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章注意注意: pn 表示得到表示得到 p 指向的结构体变量中的指向的结构体变量中的成员成员 n 的的值值 pn + + 表示得到表示得到 p 指向的结构体变量中指向的结构体变量中的成员的成员 n 的的值值用完该值后使其加用完该值后使其加 1 + +pn 表示使表示使 p 指向的结构体变量中的指向的结构体变量中的成员成员 n 的的值值加加 1 ( 先加先加 ) 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章二、二、 指向结构体数组的指针指向结构体数组的指针 例例 10.4 ( p269) struct student int num ; char name20 ; char sex ; int age ; ; struct student stu3 = 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 ” ) ; for ( p = stu ; p num , p name , p sex , p age ) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章运行结果运行结果: No Name sex age 10101 Li Lin M 18 10102 Zhang Fun M 19 10104 Wang Min F 20stu0stu1stu2 4 4项项 4 4项项 4 4项项pp+1p+2语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 注意注意: 1. 指向结构体数组的指针指向结构体数组的指针 p 加加 1 的含义。

    的含义 如如: ( + + p )num 和和 ( p + + )num 2. 不能直接把结构体数组元素中的某一成员的地址赋不能直接把结构体数组元素中的某一成员的地址赋给给指向结构体数组的指针指向结构体数组的指针 如如: p = &stu2 . num ; 因为因为地址类型地址类型不同 而而 :p = ( struct student * ) &stu2.num则可以语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 三、三、 用指向结构体的指针作函数参数用指向结构体的指针作函数参数 在函数调用时,结构体变量的传递有在函数调用时,结构体变量的传递有三三种形式种形式: 1. 用结构体变量的用结构体变量的成员成员作参数 如如: stu1 . num 等 2. 用指向结构体用指向结构体变量变量(或或数组数组)的的指针指针参数 3. 用整个结构体用整个结构体变量变量作参数 (占用内存多,传递数占用内存多,传递数 据速度慢据速度慢)语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 例例 10.5 (p271) # define FORMAT “ %d n%s n%f n%f n%f n ” struct student int num ; char name20 ; float score3 ; ; main ( ) void print ( struct student ) ; struct student stu ; stu . num = 12345 ; strcpy ( stu . name , “ Li Li ” ) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 stu . score0 = 67.5 ; stu . score1 = 89 ; stu . score2 = 78.6 ; print ( stu ) ; void print ( struct student stu ) printf ( FORMAT , stu.num , stu.name , stu.score0 , stu.score1 , stu.score2 ) ; printf ( “n” ) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 2. 用指向结构体变量的指针作实参用指向结构体变量的指针作实参 # define FORMAT “ %d n%s n%f n%f n%f n ” struct student int num ; char name20 ; float score3 ; stu = 12345, “Li Li ” , 67.5 , 89.78 , 6 ; main ( ) void print ( struct student * ) ; print ( &stu) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 void print ( struct student * p ) printf ( FORMAT , pnum , pname , pscore0 , pscore1 , p score2 ) ; printf ( “n”) ; 说明说明: 1. 程序中各成员的赋值可用程序中各成员的赋值可用 scanf 函数。

    函数 scanf (“ %d %s %f %f %f ” , &stu.num , stu.name , &stu.score0 , &stu.score1 , &stu.score2 ) ; 2. 如果结构体数组中包含有实型数组成员,不能用如果结构体数组中包含有实型数组成员,不能用 scanf 函数直接输入实型数组元素的值可采用间接函数直接输入实型数组元素的值可采用间接 输入的方式输入的方式语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 struct student char name20 ; float score2 ; stu 2 ; for( i = 0 ; i 2 ; i + + ) for( j = 0 ; j 2 ; j + + ) scanf( “ %f ” , &stui. scorej ) ; 可改为:可改为:float t ; for( i = 0 ; i 2 ; i + + ) for( j = 0 ; j 2 ; j + + ) scanf( “ %f ” , &t ) ; stui. scorej = t ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章10.8 共用体共用体一、共用体的概念一、共用体的概念 几个不同的变量共占同一段内存的结构,叫几个不同的变量共占同一段内存的结构,叫“共共用体用体”类型结构。

    类型结构 “共用体共用体”类型变量的定义:类型变量的定义: union 共用体名共用体名 成员表列成员表列 变量表列变量表列 ; 如如: union data int i ; char ch ; float f ; a , b , c ;起始地址起始地址实实 型型 变变 量量ch整型整型 变量变量语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 union data int i ; char ch ; float f ; ; union data a , b , c ;union int i ; char ch ; float f ; a , b , c ; 由上看出,由上看出, 共用体共用体和和结构体结构体的定义形式的定义形式相似相似 但含义是不同的结构体变量所占内存的长度是各成但含义是不同的结构体变量所占内存的长度是各成员占的内存长度之员占的内存长度之和和且每个成员分别占有其自己的且每个成员分别占有其自己的内存单元内存单元 共用体变量所占的内存长度等于最长的成共用体变量所占的内存长度等于最长的成员的长度员的长度语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章二、 共用体变量的引用方式 规则: 先定义,后使用,且只能用成员运算符来引用共用体变量中的成员 如如: a . i a . ch a . f 等等。

    等等 而而: printf ( “ %d ” , a ) ; ( 不合法不合法 )语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章三、共用体类型数据的特点三、共用体类型数据的特点 1. 并非所有成员都同时存在和起作用即并非所有成员都同时存在和起作用即:每一瞬时只有每一瞬时只有 一个成员起作用一个成员起作用 2. 共用体变量中起作用的成员是最后一次存放的成员共用体变量中起作用的成员是最后一次存放的成员 如如: union data int i ; char ch ; float f ; a ; a . i = 1 ; a . ch = a ; a . f = 1.5 ; 则只有则只有 a . f 有效,而此时有效,而此时 a . i 和和 a . ch 已无意义已无意义 ch整型整型 变量变量实实 型型 变变 量量起始地址起始地址语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章但若存在相但若存在相同数据类型同数据类型的成员,则该成员就有意义的成员,则该成员就有意义 如如: main ( ) union data int i ; char ch ; float f ; float x ; a ; a . i = 1 ; a . ch = a ; a . f = 1.5 ; printf ( “%f , %f n” , a . f , a . x ) ; 输出为输出为: 1.5 , 1.5ch i f x语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 3. 共用体变量的地址和各成员的地址都是同一地址。

    共用体变量的地址和各成员的地址都是同一地址 4. 不能对不能对共用体变量共用体变量赋值和对其初始化赋值和对其初始化 union data int i ; char ch ; float f ; a = 1 , a , 1.5 ; ( 不合法不合法 ) 5. 共用体变量共用体变量不能不能作函数参数,但指向共用体变量的指作函数参数,但指向共用体变量的指 针则针则可以可以 6. 结构体类型和共用体类型可以相互嵌套结构体类型和共用体类型可以相互嵌套 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 union data struct st int a ; int b ; x ; int y ; int z ; max ;struct st union data int a ; char b ; x ; int y ; float z ; min ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 补充例题补充例题1: 以下程序的输出为以下程序的输出为: # include “stdio.h” main ( ) union data struct st int x ; int y ; m ; int a ; int b ; e ; e . a = 1 ; e . b = 2 ; e . m . x = e . a * e . b ; e . m . y = e . a + e . b ; printf ( “ n%d , %d ”, e . m . x , e . m . y ) ; printf (“n%d , %d ”, e .a , e .b) ; xya起始地址起始地址b4 , 84 , 8语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 补充例题补充例题2: 以下程序的输出为以下程序的输出为: # include “stdio.h” main ( ) union data char a ; int x ; e ; e . x = 257 ; e . a = e ; printf ( “ %c , %d ”, e . a , e . x ) ; e , 3570000000100000001x = 25701100101 a = e 0110010100000001若若 x = 255 , 则输出为则输出为: e , 101语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章10.10 用用 typedef 定义类型定义类型 C语言中使用类型的方法有三种语言中使用类型的方法有三种: 1. 直接使用直接使用C 提供的标准类型名提供的标准类型名(如如: int char float 等等)。

    2. 用户自己定义的用户自己定义的结构体结构体,共用体共用体,指针指针等类型 3. 用用 typedef 定义定义新类型名新类型名来代替已有的类型名来代替已有的类型名 typedef int INTEGER ; (指定指定 INTEGER 代表代表 int 类型类型) typedef float REAL ; int i , j ; 与与 INTEGER i , j ; 完全等价完全等价 float a , b ; 与与 REAL a , b ; 完全等价完全等价 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章定义一个新类型名的方法定义一个新类型名的方法: (1) 先按定义变量的方法写出定义体先按定义变量的方法写出定义体 如如: int i ; (2) 将变量名名换成新类型名将变量名名换成新类型名( 将将 i 换成换成 INTEGER ) (3) 在最前面加在最前面加 typedef 如如: typedef int INTEGER (4) 然后可以用新类型名去定义变量然后可以用新类型名去定义变量语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 如如: int n100 ; int NUM100 ; typedef int NUM100 ; NUM n ; 1. typedef char *STRING ; (定义定义STRING为字符指针类为字符指针类型型) STRING p , s10 ; ( p 为字符指针变量为字符指针变量, s 为指针数组为指针数组) 2. typedef int (*POINTER) ( ) (定义定义POINTER为指向返回为指向返回整整 POINTER p1 , p2 ; 型型值的值的函数指针函数指针类型类型 ) 3. typedef struct int month ; int day ; int year ; DATA ; DATA birthday ; DATA *p ; 1234语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章 说明说明: 1. typedef 可以定义各种可以定义各种类型名类型名,但不能定义变量。

    使,但不能定义变量使 用用 typedef 有时更方便如有时更方便如: int a10 , b10 , c10 , d10 ; typedef int ARR10 ; ARR a , b , c , d ; 2. typedef 与与 #define 的区别的区别 #define COUNT int typedef int COUNT ; 前者是在预编译时处理的,只是简单的字符替换前者是在预编译时处理的,只是简单的字符替换而后者是在编译时处理的,并不是简单的字符替换而后者是在编译时处理的,并不是简单的字符替换 3. 使用使用 typedef 有利于程序的通用和移植有利于程序的通用和移植 如如: typedef int INTEGER ; typedef long INTEGER ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第十十十十十十章章章章章章作业作业P296:11.3 11.4 11.5P296:11.3 11.4 11.5。

    点击阅读更多内容
    卖家[上传人]:仙人指路
    资质:实名认证