C语言学习之-----(十九)  联合和枚举

(十九) 联合和枚举

联合(union):

一、联合说明和联合变量定义

联合也是一种新的数据类型, 它是一种特殊形式的变量。

联合说明和联合变量定义与结构十分相似。其形式为:

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[10];

若要访问结构变量y[1]中联合x的成员i, 可以写成:

y[1].x.i;

若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:

*y[2].x.ch;

若写成y[2].x.*ch;是错误的。

二、结构和联合的区别

1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员, 而结构的所有成员都存在。

2. 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值互不影响的。

下面举一个例子来加深对联合的理解。

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。

下面看一个例子:

main()

{

enum colors {red=1,green,blue}col;

int cl;

printf(1=red,2=green,3=blue. seclect: );

scanf(%d,&cl);

col=(enum colors) cl; /*强制转换*/

switch(col)

{

case red:

printf(red\n);

break;

case green:

printf(green\n);

break;

case blue:

printf(blue\n);

break;

defalut:

break;

}

}

* **类型说明** *

类型说明的格式为:

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被定义为结构数组和结构指针。

我们经常在题目中有要求,输入一个整数,然后以这个整数作为数组的元素个数,下面的程序代码是错误的。

int n,array[n];

scanf(%d,&n);

在Turbo C中,不允许出现动态数组。那么如果必须需要这样时,就只能使用链表了。

ily:5s�6�1

(0)

相关推荐

  • c语言学习笔记(八:struct、union、enum、typedef

    自定义数据类型 1.struct 1)结构体的声明 声明结构体变量:结构体所占内存大小是其成员所占内存之和. struct 结构体类型名{//结构体类型名可省略,匿名结构体 成员表://可以有多个成员 ...

  • 【C语言笔记】枚举

    首先,提一下宏定义#define,其一般形式为: #define 宏名 字符串 这个知识点很重要,到处能用得到.其可以与typedef来进行类比进行理解(可查看#define与typedef的区别?) ...

  • C语言知识总结——宏,枚举,结构体,共用体

    C语言知识总结——宏,枚举,结构体,共用体

  • 【C语言笔记】结构体

    我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...

  • 【C语言资料更新】C语言中的枚举类型(enum)

    文/Edward 枚举是C语言里面所定义的一种基本数据类型,它可以使程序变得更加简介,更加易读.枚举的定义类似于我们数学里面的有限集合,如一周有7天,分别是SUNDAY.MONDAY.TUESDAY. ...

  • (2条消息) opencv学习(十九)之均值滤波blur

    从本篇开始采用opencv3.2版本进行编译!!! 均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值.其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围 ...

  • 乾元无诀:《子平真诠》学习之十九论四凶神能成格

    煞伤枭刃,四凶神也,然施之得宜,亦能成格.如印绶根轻,透煞为助,煞能成格也.财逢比劫,伤官可解,伤能成格也.食神带煞,灵枭得用,枭能成格也.财逢七煞,刃可解厄,刃能成格也. 是故财不忌伤,官不忌枭,煞 ...

  • 乾元无诀:《子平真诠》学习之三十九论杂格及取运

    杂格者,月令无用,以外格而用之,其格甚多,故谓之杂.大约要干头无官无煞,方成格,如有官煞,则自有官煞为用,不列外格矣.若透财尚可取格,然财根深,或财透两位,则亦以财为重,不取外格也. 杂格,也就是外格 ...

  • IOS学习笔记十九NSArray和NSMutableArray

    IOS学习笔记十九NSArray和NSMutableArray

  • R语言可视化(三十九):森林图绘制

    39. 森林图绘制清除当前环境中的变量rm(list=ls())设置工作目录setwd("C:/Users/Dell/Desktop/R_Plots/39forest/")使用su ...

  • 19.跟着倪海厦老师每天学习金匮要略|第十九集

    还是伤到津液,反正总而言之就是重亡阴液,肺里面的津液没有了,哦,所以叫做肺痿,所以你随时要保持肺里面要有津液,哦,这个这是中医的观念,那你如何去看脉呢,寸口,寸口脉就是阳脉,就是胸腔的脉,胸阳的脉,非 ...

  • 29.跟着倪海厦老师每天学习金匮要略|第二十九集

    那你如果吐不出来,这个就要吃我们的乌头赤石脂丸,所以乌头赤石脂丸是很热的药,很热的药呢,为什么呢,因为是寒痰,寒痰,这个就是,这个人呢,心如口敢蒜状,真的就像敢蒜状,觉得胸口很辣,就好像吃了蒜一样,辣 ...

  • 49.跟着倪海厦老师每天学习金匮要略|第四十九集

    亡血不可发其表,汗出,即寒栗而振. 啊,这个,亡血者不可发其表,汗出,即寒栗而振.亡血的定义呢,有的人是车祸,大量出血.有的人是流鼻血,有的人是下血,大便里面带血,有的人是吐血,反正,中规一句就是,病 ...

  • 59.跟着倪海厦老师每天学习金匮要略|第五十九集

    因为你这个怀孕期间没有什么痛苦,用白术啊,白术就可以把水排掉啦,所以怀孕中间,十个月,你可以一直吃它.然后产后呢,哦,各种病都可以用当归散,所以当归散是一个粉剂.很好用的一个调理的处方,如果说像刚刚讲 ...