2015年计算机等级考试二级C语言基础教程:指针、结构、联合和枚举(4)
发布时间:2010/11/2 16:32:32 来源:城市学习网 编辑:ziteng
2.结构和联合的区别
结构和联合有下列区别:
1.结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员,而结构的所有成员都存在。
2.对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。
下面举一个例了来加对深联合的理解。
例4:
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
输出结果为:
AB
6261
从上例结果可以看出:当给i赋值后,其低八位也就是first和second的值;当给first和second赋字符后,这两个字符的ASCII码也将作为i的低八位和高八位。
枚举(enum)
枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。
例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。
枚举的说明与结构和联合相似, 其形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数],
} 枚举变量;
如果枚举没有初始化,即省掉"=整型常数"时,则从第一个标识符开始,顺次赋给标识符0,1,2, ...。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。
例如下列枚举说明后,x1,x2,x3,x4的值分别为0,1,2,3。
enum string{x1, x2, x3, x4}x;
当定义改变成:
enum string
{
x1,
x2=0,
x3=50,
x4,
}x;
则x1=0, x2=0, x3=50, x4=51
注意:
1.枚举中每个成员(标识符)结束符是",",不是";",最后一个成员可省略","。
2.初始化时可以赋负数,以后的标识符仍依次加1。
3.枚举变量只能取枚举说明结构中的某个标识符常量。
例如:
enum string
{
x1=5,
x2,
x3,
x4,
};
enum strig x=x3;
此时,枚举变量x实际上是7。
类型说明
类型说明的格式为:
typedef 类型 定义名;
类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。这里类型是Turbo C许可的任何一种数据类型。定义名表示这个类型的新名字。
例如: 用下面语句定义整型数的新名字:
typedef int SIGNED_INT;
使用说明后,SIGNED_INT就成为int的同义词了,此时可以用SIGNED_INT定义整型变量。
例如:SIGNED_INT i, j;(与int i, j等效)。
但long SIGNED_INT i, j;是非法的。
typedef同样可用来说明结构、联合以及枚举。
说明一个结构的格式为:
typedef struct{
数据类型 成员名;
数据类型 成员名;
...
} 结构名;
此时可直接用结构名定义结构变量了。例如:
typedef struct{
char name[8];
int class;
char subclass[6];
float math, phys, chem, engl, biol;
} student;
student Liuqi;
则Liuqi被定义为结构数组和结构指针。 [NextPage] 在第二节讲过的文件操作中,用到的FILE就是一个已被说明的结构,其说明如下:
typedef struct
{
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
} FILE
这个结构说明已包含在stdio.h中,用户只要直接用FILE定义文件指针变量就可以。事实上,引入类型说明的目的并非为了方便, 而是为了便于程序的移植。
预处理指令
由ANSI的标准规定,预处理指令主要包括:
#define
#error
#if
#else
#elif
#endif
#ifdef
#ifndef
#undef
#line
#pragma
由上述指令可以看出,每个预处理指令均带有符号"#"。下面只介绍一些常用指令。
1.#define指令
#define指令是一个宏定义指令,定义的一般形式是:
#define 宏替换名字符串(或数值)
由#define指令定义后,在程序中每次遇到该宏替换名时就用所定义的字符串(或数值)代替它。
例如: 可用下面语句定义TRUE表示数值1, FALSE表示0。
#define TRUE 1
#define FALSE 0
一旦在源程序中使用了TRUE和FALSE,编译时会自动的用1和0代替。
注意:
1.在宏定义语名后没有";"
2.在Turbo C程序中习惯上用大写字符作为宏替换名,而且常放在程序开头。
3.宏定义还有一个特点, 就是宏替换名可以带有形式参数,在程序中用到时,实际参数会代替这些形式参数。
例如:
#define MAX(x, y) (x>y)?x:y
main()
{
int i=10, j=15;
printf("The Maxmum is %d", MAX(i, j);
}
上例宏定义语句的含义是用宏替换名MAX(x,y)代替x,y中较大者,同样也可定义:
#define MIN(x,y) (x<y)?x:y
表示用宏替换名MIN(x,y)代替x,y中较小者。
2.#error指令
该指令用于程序的调试,当编译中遇到#error指令就停止编译。其一般形式为:
#error 出错信息
出错信息不加引号,当编译器遇到这个指令时,显示下列信息并停止编译。
Fatal: filename linename error directive
3.#include 指令
#include 指令的作用是指示编译器将该指令所指出的另一个源文件嵌入#include指令所在的程序中,文件应使用双引号或尖括号括起来。Turbo C库函数的头文件一般用#include指令在程序开关说明。
例如:
#include <stdio.h>
程序也允许嵌入其它文件,例如:
main()
{
#include <help.c>
}
其中help.c为另一个文件, 内容可为
printf("Glad to meet you here!");
上例编译时将按集成开发环境的Options/Directories/Include directories中指定的包含文件路径查找被嵌入文件。
4.#if、#else、#endif指令
#if、#els和#endif指令为条件编择指令,它的一般形式为:
#if 常数表达式
语句段;
#else
语句段;
#endif
上述结构的含义是:若#if指令后的常数表达式为真,则编译#if到#else 之间的程序段;否则编译#else到#endif之间的程序段。
例如:
#define MAX 200
main()
{
#if MAX>999
printf("compiled for bigger\n");
#else
printf("compiled for small\n");
#endif
}
5.#undef指令
#undef指令用来删除事先定义的宏定义,其一般形式为:
#undef 宏替换名
例如:
#define TRUE 1
...
#undef TURE
#undef主要用来使宏替换名只限定在需要使用它们的程序段中。