结构体
struct 结构体标签(可选)
{
类型1 标识符1;
类型2 标识符2;
.......
}(变量定义可选);
联合
union 可选的标签
{
类型1 标识符1;
类型2 标识符2;
........
}可选的变量定义;
联合与结构体相似,但内存布局上存在关键性的区别。结构体中每个成员顺序存储;而在联合中,所有的成员都是从偏移量为零处开始存储(位置是重叠的),并且
在某一时刻,只有一个成员真正存储于改地址。
枚举(它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型)
enum 可选标签{内容 .....}可选变量定义;
若对列表中的某个标识符进行了赋值,那么紧接其后的那个标志符就比所赋值大1.但对于前面未定义的标识符不能反推
枚举中的名字通常一直在调试器中可见,可以在调试代码时使用;而#define宏定义的常量,一般编译时就被替换掉了。
示例program
- #include <stdio.h>
- struct s
- {
- int a;
- char c;
- } s1;
- enum e
- {
- a,b=3
- }e1;
- union u
- {
- int a;
- int b;
- char c;
- }u1;
- int main(void)
- {
- s1.a=3;
- u1.a=3;
- u1.b=4;
- e1=b;
- printf("struct:s1.a=%d\n",s1.a);
- printf("enum:e1_b=%d\n",e1);
- printf("union:u1.a.&=%x\n",&u1.a);
- printf("union:u1.b.&=%x\n",&u1.b);
- }
运行结果
从运行结果可知联合中所有成员共用一个存储地址,同时有且只有一个存在。