联合
联合,是一个能在同一块存储空间存储不同类型(不同时)数据的类型。因此为联合的存储空间为所有成员中占据空间最大的。它允许创建一个用于保存一个类型不定的值的变量。简单点说,可以用该变量保存char类型的,也可以用于保存char*类型的,甚至是struct类型的。如:
union author {
char* name;
int a;
};
void test() {
union author a = {
"vafda"
};
a.a = 12;//此时a所代表的存储空间存储的是int类型
printf("%d\n",a.a);//能正常输出12
a.name = "name";//此时a所代表的存储空间存储的是字符串
printf("%s--%d\n",a.name,a.a);//name可正常输出,但a的值就不固定的
}
上述代码中,首先在a所占的内存块中存储int型12,然后存储string类型的name,此时就无法使用原来存储的值。
除上述外,联合与结构体类似,除了使用的关键字不一样:结构体使用struct,而联合使用union。其余的定义,声明变量,初始化,成员赋值,指针,数组都与结构体一样。
枚举
与结构体类似,但使用enum关键字,用于声明代表整数常量的符号。并且枚举是内部使用的。
枚举常量为int类型的,但可以将它们赋值给任意的整数类型,只要该类型能容纳下枚举常量的值。
enum e{
red,green
};
void test() {
unsigned char c = red;
}
上述代码将int类型赋值给了unsigned char类型的变量,这是可行的,因为c可以容纳下red的值(其值为0)。
值
在默认情况下,枚举常量中的值被指定为整数值0,1,2等等。但可以为它们指定值。如果只针对一个常量进行赋值,而没有对后面的常量进行修改,那么后面的常量会被赋予后续的值。如下:
enum e {
red = 100, green
};
上述代码中,将red赋值成100,那么green的值将会是101。
typedef
为一个指定类型指定别名。它只能作用于类型,不能作用于数值;它的解释由编译器进行,而不是像#define一样由预处理器处理。如:
typedef struct book Book;
Book b1;//使用别名Book代表结构体book
在上述代码中,typedef类型于#define。但两者区别很大:
作用域
它的作用域取决于typedef语句所在的位置。如果在函数内部,那它的作用域就是局部的;在函数外部,则是全局的。
与#define的区别
1,typedef只能用于类型,而不能用于数值。即:typedef 100 I;是错误的。但#define可以#define I 100。
2,typedef是后面的表示前面,而#define是前面的代替后面。上面语句中,在实际执行时,会将所有的I全部换成100。
3,typedef由编译器进行解释,而#define由预处理器进行。
4,typedef定义后需要加分号,因为它是一个完整的语句,而#define不用,因为它只是一个简单的代替。如下:
#define String char*
typedef char* String1;
void test() {
String n1,m1;
String1 n2,m2;
m1='a';
m2="ba";
}
上述两种表示方法含义完全不同:char *n1,m1,表示n1是char*,而m1只是char类型;String1n2,m2却表示n2与m2都是char*类型的。
因为String1代表着char*类型,声明n2,m2时也是char*类型的。
与结构体连用
在定义结构体变量时,需要写struct+标识,可以使用typedef为该类型取一别名。有三种定义方式,如下:typedef struct book Book;
struct book{
char name[100];
double price;
};
typedef struct person{
char name[100];
int age;
} Person;
typedef struct {
char name[100];
char address[100];
} City;
void test() {
Book b1;//b1为struct book类型的
Person p;
City c;
}
第一种,先定义结构体,然后使用typedef为该结构体取别名。
第二种,在定义结构体的同时使用typedef取别名。
第三中,在第二种的基础上,可以省略结构体的标识,效果与第二种一样。
说明
1,typedef定义别名时,别名不一定在后面。如下:
typedef double (*p)(double,double);
double a(double a1,double a2){
return a1+a2;
}
void test() {
p p1 = a;
printf("%lf\n",(*p1)(2,3));
}
typedef定义时,将别名p放在中间,p代表的类型是函数指针,该函数的返回值为double,参数为两个double类型。