结构体和共用体 2 梁春燕 华电信息管理教研室
主要内容 链表 共用体 枚举类型 类型定义 小结
链表
链表 动态存储分配 使用结构体和指针操作链表
动态存储分配 C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
分配内存空间函数malloc 功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 原型声明: void *malloc(int size) “size”是一个无符号数
malloc函数例: char *pc; pc=(char *)malloc(100); (类型说明符*)表示把返回值强制转换为该类型指针。
分配内存空间函数 calloc 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 原型声明: void * calloc(int n, int size) (类型说明符*)用于强制类型转换。 calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
calloc举例: struct stu *ps; ps=(struet stu*)calloc(2,sizeof(struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
释放内存空间函数free 声明形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
例:分配一块区域,输入一个学生数据 main() { struct stu{ int num; char *name; char sex; float score; } *ps; ps=(struct stu*)malloc(sizeof(struct stu)); (*ps).num=102; ps->name="Zhang ping"; ps->sex='M'; ps->score=62.5; printf("Number=%d\nName=%s\n",ps->num,ps->name); printf("Sex=%c\nScore=%f\n",ps->sex,ps->score); free(ps); }
使用结构体和指针操作链表 链表 链表的生成 链表的操作 一种重要的数据结构; 动态地进行存储分配的结构。 动态存储分配 结构体 -- 结点 指针– 链接结点的地址 链表的操作 链表的建立、输出、删除、插入等。
共用体
共用体 构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) 共用体类型定义 union 共用体名 { 定义形式: union 共用体名 { 类型标识符 成员名; ……………. }; 例 union data { int i; char ch; float f; }; f ch i 类型定义不分配内存
共用体变量的定义 形式一: union data { int i; char ch; float f; }a,b; 形式二: }; union data a,b,c,*p,d[3]; 形式三: union { int i; char ch; float f; }a,b,c; f ch i a b 共用体变量任何时刻 只有一个成员存在 共用体变量定义分配内存, 长度=最长成员所占字节数
p->i p->ch p->f 共用体变量引用 引用方式: 共用体指针名->成员名 共用体变量名.成员名 (*共用体指针名).成员名 引用规则 不能引用共用体变量,只能引用其成员 union data { int i; char ch; float f; }; union data a,b,c,*p,d[3]; a.i a.ch a.f p->i p->ch p->f (*p).i (*p).ch (*p).f d[0].i d[0].ch d[0].f 共用体变量中起作用的成员是最后一次存放的成员 不能在定义共用体变量时初始化 例 union { int i; char ch; float f; }a; a=1; () 例 a.i=1; a.ch=‘a’; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果不对) 可以用一个共用体变量为另一个变量赋值 例 union { int i; char ch; float f; }a={1,’a’,1.5}; () 例 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; ()
例 将一个整数按字节输出 main() { union int_char { int i; char ch[2]; }x; 例 将一个整数按字节输出 main() { union int_char { int i; char ch[2]; }x; x.i=24897; printf("i=%o\n",x.i); printf("ch0=%o,ch1=%o\n ch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]); } 01100001 01000001 低字节 高字节 01000001 01100001 ch[0] ch[1] 运行结果: i=60501 ch0=101,ch1=141 ch0=A,ch1=a
结构体与共用体 区别: 存储方式不同 联系: 两者可相互嵌套 struct node { char ch[2]; ch int k; a union node }b; a ch k b 变量的各成员同时存在 任一时刻只有一个成员存在
枚举类型
枚举类型 枚举类型:变量只有几种可能的值。 枚举类型定义 enum 枚举类型名{枚举元素列表}; 定义形式: enum 枚举类型名{枚举元素列表}; 例 enum weekday{sun, mon, tue, wed, thu, fri, sat}; 变量定义形式: 例 enum weekday{sun, mon, tue, wed, thu, fri, sat}workday, weekend; 例 enum weekday{sun, mon, tue, wed, thu, fri, sat}; enum weekday workday, weekend; 枚举元素,又称枚举常量,是用户定义的标识符; 枚举元素是有值的,缺省以0开始,也可以指定; 枚举变量的值只能是定义的枚举元素; 枚举值可作判断比较。
类型定义
用typedef定义类型 功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name; 例 typedef int INTEGER; 例 INTEGER a,b,c; REAL f1,f2; 类型定义语句关键字 已有数据类型名 用户定义的类型名 例 typedef float REAL; int a,b,c; float f1,f2; 类型定义后,与已有类型一样使用 说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同 define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名
typedef定义类型步骤 类型定义可嵌套 例 定义结构体类型 struct date { int month; int day; 按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j; 类型定义可嵌套 例 定义结构体类型 struct date { int month; int day; int year; }d; 例 定义函数指针类型 int (*p)(); int (*POWER)(); typedef int (*POWER)(); POWER p1,p2; 例 定义结构体类型 struct date { int month; int day; int year; }DATE; 例 定义数组类型 int a[100]; int ARRAY[100]; typedef int ARRAY[100]; ARRAY a,b,c; 例 定义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s[10]; 例 定义结构体类型 typedef struct date { int month; int day; int year; }DATE; 例 定义结构体类型 DATE birthday, *p; 例 typedef struct club { char name[20]; int size; int year; }GROUP; typedef GROUP *PG; PG pclub; GROUP为结构体类型 PG为指向GROUP的指针类型 struct date { int month; int day; int year; }birthday, *p; int (*p1)(),(*p2)(); int a[100],b[100],c[100]; char *p; char *s[10]; GROUP *pclub; struct club *pclub;
小结
小结 动态存储分配; 使用结构体和指针操作链表; 共用体变量的定义和引用:union 枚举类型的定义和使用:enum 用 typedef 定义类型的方法。
END