第十章 结构体与共用体(3)

2019-03-05 21:24

分配一个结点: struct student1 { int num; float score;

struct student1 *next; } stu,*p;

或 sizeof(stu) p=(struct student1 *)malloc(sizeof(struct student1)); 2.calloc函数

函数原型:void *calloc(unsigned n ,unsigned size) 作用:在内存中分配n个长度为size字节的连续空间。

返回指向分配域的起始地址指针,若不成功则返回空指针(NULL)。 3.free函数

函数原型: void free(void *p)

作用: 释放由p指向的内存空间,无返回值。

§10.8 共用体

一. 共用体的概念

几个不同类型的变量存放在同一段内存单元中(它们的起始地址是一样的) 共用体定义的一般形式: union 共用体名 { 成员表列 } 变量表列; 如: union data

{ int i; char ch; float f;

ch i f } a,b,c; 或

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

三.共用体类型数据的特点

在使用共用体类型数据时要注意以下一些特点:

1.共用体变量中的成员不能同时都起作用,在某一时刻只能一个成员起作用(有意义),其他成员则是无意义的。起作用的成员是最后一次存入数据的成员。如:

main()

{ union data { int i; char ch; } a; a.ch=’a’;

printf(“\\n%d,%d\\n”,a.ch,a.i);

a.i=266;

printf(“\\n%d,%d\\n”,a.ch,a.i); }

2.共用体变量的地址与它的各成员的地址是一样的。 即: &a=&a.i=&a.ch

3.不能直接引用共用体变量名,也不能对它进行初始化。

4.不能把共用体变量作为函数参数,也不能使函数返回一共用体类型数据。但可以使用指向共用体变量的指针作为函数参数。

5.结构体类型的成员可以是共用体类型的,共用体的成员也可以是结构体的和数组。也可以定义共用体数组。

如何知道应该使用共用体变量中的哪一个成员呢?一般使用一个变量用来标记应使用哪个成员。如:

struct { union { int i; char ch; float f; } da; int type; } a; ??

a.da.f=1.5; a.type=3; ??

switch (a.type)

{ case 1: printf(“%d\\n”,a.da.i); break; case 2: printf(“%c\\n”,a.da.ch); break; case 3: printf(“%f\\n”,a.da.f); break; } ??

§10.9 枚举类型

枚举类型是ANSI C新标准所增加的,“枚举”的含义为可以一一列举出来的。

枚举类型的定义:

enum weekday {sun,mon,tue,wed,thu,fri,sat}; 枚举变量的定义:

enum weekday {sun,mon,tue,wed,thu,fri,sat}; enum weekday day1,day2; 或

enum weekday {sun,mon,tue,wed,thu,fri,sat} day1,day2; 或

enum {sun,mon,tue,wed,thu,fri,sat} day1,day2; 说明:

1.在定义枚举类型时{ }内的标识符(枚举常量)不能相同, 如: enum ch {a,b,c,a,i,p}; 错误。 这些标识符在程序中也不能作为其它用处: 如: enum ch {a,b,c,d};

?? main() { int a; char c; ??

2.枚举元素按常量处理(称为枚举常量),它们不是变量,不能对它们赋值。 3.枚举元素是有值的,C编译按定义时的顺序使它们的值为0,1,2,?。

称为枚举元素或枚举常量。 如 main()

{ enum weekday {sun,mon,tue,wed,thu,fri,sat} day; printf(“\\n”);

for (day=sun;day<=sat; day++) printf(“M”,day); }

也可以改变枚举元素的值,在定义时指定:

main()

{ enum weekday {sun=2,mon,tue,wed=1,thu,fri,sat} day1,day2; day1=mon; day2=fri;

printf(“MM\\n”,day1,day2); }

4.可以把枚举量看成一个整型值处理,如:比较大小,算术运算,赋值。 main()

{ enum weekday {sun=2,mon,tue,wed=1,thu,fri,sat} day1,day2; int i;

day1=2; day2=fri; i=day1+day2;

printf(“MMM\\n”,day1,day2,i); if (day1<=day2) printf(“aa\\n”); else printf(“bb\\n”);

if (tue<=day2) printf(“aa\\n”); else printf(“bb\\n”); }

§10.10 用typedef定义类型

一.为什么要引入自定义类型

方便于定义结构体,共用体,枚举等类型。 一般用大写字母。 二.定义格式

typedef <已有类型名> <自定义类型名>; 如:

typedef int INTEGER; typedef struct

{ int month; int day; int year; } DATE;

typedef float NUM[10]; typedef char *STRING;

INTEGER i,j; (相当于 int i,j;) DATE birthday, *p;

NUM x; STRING str;

(相当于 (相当于 float x[10];) char *str;)


第十章 结构体与共用体(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:6.26刘转平陶园中英文实验学校期末检测试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: