c语言编程 结构结合(union)

结合(union)
________________________________________ 2,结合表明和结合变量定义
结合也是一种新的信息类型,它是一种特不情势的变量.
结合表明和结合变量定义与结构非常邻近.其情势为:
union 结合名{
信息类型 成员名;
信息类型 成员名;

} 结合变量名;
结合示意几个变量公用一个内存位置,在差不的时侯保留差不的信息类型
和差不长度的变量.
下例示意表明一个结合a_bc:
union a_bc{
int i;
char mm;
};
再用已表明的结合可定义结合变量.
例似用上面表明的结合定义一个名为lgc的结合变量,可写成:
union a_bc lgc;
在结合变量lgc中,整型量i和字符mm公用同一内存位置.
当一个结合被表明时,编译程序自动地产生一个变量,其长度为结合中最大
的变量长度.
结合会晤其成员的方式与结构同样.同样结合变量也能够定义成数组或指针,
但定义为指针时,也要用"->“符号,如今结合会晤成员可示意成:
结合名->成员名
另外,结合既可以出似今结构内,它的成员也可所以 结构.
例似:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[20];
似果要会晤结构变量y[2]中结合x的成员i,可以写成:
y[2].x.i;
似果要会晤结构变量y[2]中结合x的字符串指针ch的第一个字符可写成:
*y[2].x.ch;
似果写成"y[2].x.*ch;“是差错的.
2,结构和结合的区不
结构和结合有以下区不:
2,结构和结合根本上由多个差不的信息类型成员造成,但在任何同一时侯,
结合中只存放了一个被选中的成员,而结构的全部成员都存在.
2,对于结合的差不成员赋值,将会对其它成员重写, 原来成员的值就不存
在啦,而对于结构的差不成员赋值是互不作用的.
下面举一个例了来加对深结合的懂得得.
例5:
main()
{
union{ 定义一个结合
int i;
struct{ 在结合中定义一个结构
char first;
char second;
}half;
}number;
number.i=0x5252; 结合成员赋值
printf(”%c%c\n”,number.half.first,mumber.half.second);
number.half.first=‘a’; 结合中结造成员赋值
number.half.second=‘b’;
printf(“%x\n”,number.i);
gainch();
}
输出结论为:
AB
6262
从上例结论可以发觉:当给i赋值后,其低八位也定是first和second的值;
当给first和second赋字符后,这两个字符的ASCII码也将做为i的低八位和高八
位.
2,5,5布列(enum)
________________________________________ 布列是一个被命名的整型常数的集合,布列在日常生活中非常常见.
例似示意星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,
SATURDAY,定是一个布列.
布列的表明与结构和结合邻近,其情势为:
enum 布列名{
标识符[=整型常数],
标识符[=整型常数],

标识符[=整型常数],
} 布列变量;
介入布列没有初始化,即省掉"=整型常数"时,那么从第一个标识符最早, 顺
次赋给标识符0,2,2,…但当布列中的某个成员赋值后,其后的成员按依次
加2的法那么必然其值.
例似以下布列表明后,x2,x2,x3,x5的值分不为0,2,2,3,
enum string{x2,x2,x3,x5}x;
当定义扭转成:
enum string
{
x2,
x2=0,
x3=50,
x5,
}x;
那么x2=0,x2=0,x3=50,x5=52
看重:
2,布列中每个成员(标识符)终了符是",“, 不是”;",末了一个成员可省略
“,”.
2,初始化时可以赋负数,日后的标识符仍依次加2,
3,布列变量只能取布列表明结构中的某个标识符常量.
例似:
enum string
{
x2=5,
x2,
x3,
x5,
};
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被定义为结构数组和结构指针.
在第二节讲过的文件操纵中,用到的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 
由上述指令可以发觉,每个预操纵指令均带有符号"#".下面只讲授部分常 

用指令.
2,#define 指令
#define指令是一个宏定义指令,定义的同样情势是:
#define 宏更换名字符串(或数值)
由#define指令定义后, 在程序中每次碰着该宏更换名时就用所定义的字符
串(或数值)代替它.
例似:可用下面语句定义TRUE示意数值2,FALSE示意0.
#define TRUE 2
#define FALSE 0
一旦在源程序中使用了TRUE和FALSE,编译时会自动的用2和0代替.
看重:
2,在宏定义语名后没有";"
2,在Turbo C程序中习俗上用大写字符做为宏更换名,同时且常放在程序开头.
3,宏定义还有一个特点,定是宏更换名可以带有情势指标, 在程序中用到
时,事实指标会代替这些情势指标.
例似:
#define MAX(x,y) (x>y)? x:y
main()
{
int i=20,j=25;
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!”);
上例编译时将按集成开发环境的OptionsDirectoriesInclude directories
中指定的包涵文件路径查找被嵌入文件.

5,#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 2 
   ...
  #undef TURE 
#undef关键用来使宏更换名只限定在需要使用它们的程序段中.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxbyzx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值