<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的c语言笔记,期待与您交流!
前面我分享乐结构体,这一篇笔记再分享两个数据类型:共用体和枚举
共用体
1.在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点
2.共用体定义:定义的方式和结构体相似,只用union替代了struct
union 共用体名
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
}共用体变量名;
union data
{
int a;
char b;
}data1;
3.共用体使用注意事项:
1>同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。
2>共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
3>共用体变量的地址和它的各成员的地址都是同一地址。
6>共用体变量的初始化
(1)union data a=b; //把共用体变量初始化为另一个共用体
(2)union data a={123}; //初始化共用体为第一个成员
(3)union data a={.ch='a'}; //指定初始化项目,按照C99标准
7>共用体变量也可以作为函数的参数和返回值。
8>共用体的大小是它里面成员字节数最大的那个成员的字节数
下面这个例子给大家说明以上各个注意事项
枚举
1.其实学习枚举的语法并不难,问题是什么时候就要用枚举呢?
我个人就是觉得当一个整形的变量的取值在有限范围并且具有一定意义的时候我们就可以尝试使用枚举。
还是老生常谈我们使用大家都熟悉的星期天来说明这个类型:
首先看下它是否符合使用枚举的条件:
1>int day 可以被赋的值是有限的,只能是周一到周日(当然也可以赋别的值,但是那样赋值没有任何的意义)
2>每个值都代表一周的某一天具有一定的实际意义
2.枚举的定义语法
enum DAY
{
MON=0; STU; WED; THU; FRI; SAT; SUN
};
他们的值为 MON=0 STU=1 WED=2 THU=3 FRI=4 SAT=5 SUN=6
如果我们定义WED为0则 MON=0 STU=1 WED=0 THU=1 FRI=2 SAT=3 SUN=4
3.枚举的特点:
1>枚举是一个集合,集合中的元素是一个命名的整形常量,元素之间用逗号隔开
2>DAY是一个标识符,可以看成这个集合的的名字,是一个可选项,即使可有可无的项
3>如果不特殊定义的话,第一个元素的默认值为0,之后的元素递增1
4>可以人为的定义枚举成员的值,从而自定义整个范围的值
5>枚举可以看作是#define的替代,可以用多个宏定义来代替枚举
6>枚举类型定义也是以分号结束
4.使用枚举类型如何定义枚举变量
枚举变量的取值范围被限制在枚举类型的几个元素里面,当然也可以被赋其它的值,但是没有意义;
1>枚举类型的定义和变量的声明分开
enum DAY {MON,STU,WED,THU,FRI,SAT,SUN};
enum DAY today;
enum DAY yestoday;
2>类型定义与变量声明同时进行
enum DAY {MON,STU,WED,THU,FRI} workday;
enum {MON,STU,WED,THU,FRI} workday; 这两种声明都可以,而且那个DAY这个标识符可以省略。
3>用typedef的方式
typedef enum DAY {MON, ... ,SUN}day; day为enum DAY 的别名
typedef enum{MON, ..., SUN}day;这种方式中day为enum day 的别名
声明变量:
day today,tomorrow;
注意:不能有同名的枚举类型或者枚举成员(两个枚举类型中有一个成员名相同都不可以)
4.枚举变量的赋值
1>先声明变量再赋值
2>声明变量的同事赋值
enum DAY today = Wed;
3>定义类型的同时声明变量并同时赋值
enum DAY {Mon, Stu} today=Mon, tomorrow = Stu;
5.枚举变量的使用,可以定义一个变量使用变量,也可以不定义变量使用它的元素
#include<stdio.h>
enum kk
{
BELL = 'a',
BACKSPACE = '\b',
HTAB = '\t',
RETURN = '\r',
NEWLINE = '\n',
VTAB = '\v',
SPACE = ' '
};
enum BOOLEAN { FALSE = 0, TRUE } match_flag;
int main(void)
{
int index = 0;
int count_of_letter = 0;
int count_of_letter_a = 0;
int count_of_space = 0;
char str[] = "I'm a Ely aefod a";
match_flag = FALSE;
for(; str[index] != '\0'; index++)
if( SPACE != str[index] )
{
count_of_letter++;
if (str[index] == BELL)
count_of_letter_a++;
}
else
{
match_flag = (enum BOOLEAN) 1;
count_of_space++;
}
printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);
printf("count of letters: %d and the letter a have %d times %c%c", count_of_letter, count_of_letter_a,NEWLINE, RETURN);
return 0;
}
enum kk
{
BELL = 'a',
BACKSPACE = '\b',
HTAB = '\t',
RETURN = '\r',
NEWLINE = '\n',
VTAB = '\v',
SPACE = ' '
};
enum BOOLEAN { FALSE = 0, TRUE } match_flag;
int main(void)
{
int index = 0;
int count_of_letter = 0;
int count_of_letter_a = 0;
int count_of_space = 0;
char str[] = "I'm a Ely aefod a";
match_flag = FALSE;
for(; str[index] != '\0'; index++)
if( SPACE != str[index] )
{
count_of_letter++;
if (str[index] == BELL)
count_of_letter_a++;
}
else
{
match_flag = (enum BOOLEAN) 1;
count_of_space++;
}
printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);
printf("count of letters: %d and the letter a have %d times %c%c", count_of_letter, count_of_letter_a,NEWLINE, RETURN);
return 0;
}