哑元结构的构成
哑元结构分为:
- 无名结构体
- 无名联合体
区别自定义类型
注意:对于内置类型不能如下定义变量
int int;//eror
这样是不合法的,因为int 是关键字
但是可以这样定义结构体变量:因为对于自定义的结构体变量名字不是关键字
struct Node Node;
定义成全局变量初始值都是0
定义成局部变量初始值都是随机值
无名结构体:
struct
{
char ch[2];
short sx;
}x;
struct
{
char ch[2];
short sx;
}y;
注意:不能认为x与y是同一种类型,因为在编译链接过程中,编译器给2个无名结构不同的名字,所以x和y是不同类型的结构体变量。
无名联合体
注意:只有一种结构不占空间:上面有,下面没有,是类型,类型只有定义变量才有意义,单独谈论就是图纸,不占内存
1.上面有,下面没有:不占内存
struct stu
{
int a;
union A
{
int b;
};
};
stu a;
sizeof(a);//4字节
2.上面有,下面有
struct stu
{
int a;
union A
{
int b;
}A;
};
stu a;
sizeof(a);//8字节
3.上面没有,下面有
struct stu
{
int a;
union
{
int b;
}A;
};
stu a;
sizeof(a);//8字节
4.上面没有,下面没有
struct stu
{
int a;
union
{
int b;
};
};
stu a;
sizeof(a);//8字节
区别一:
注意此时X占用8字节
struct Node
{
char ch;
union
{//a成员和f成员共用同一存储空间
int a;
float f;
};
};
int main()
{
Node x;//x虽然有3个数据成员,但是a和f被联合体包裹,共享空间
x.ch = 'x';
x.a = 10;
return 0;
}
区别二:
此时定义变量Node x 则x只占用1字节
因为此时a 和f 不是变量x的成员,AF是类型,类型是图纸,
struct Node
{
char ch;
union AF
{
int a;
float f;
};
};
int main()
{
Node x;
printf("%d \n", sizeof(x));// 1字节
Node::AF y;//4字节
return 0;
}
区别三:
此时变量x有2个数据成员:ch 和 AF
struct Node
{
char ch;
union
{
int a;
float f;
}AF;//无名联合体定义了一个变量AF
};
int main()
{
Node x;
printf("%d \n", sizeof(x));// 8字节
x.ch = 'a';
x.AF.a = 10;
return 0;
}
区别四:
变量x具有2个成员
- ch是数据成员
- AF是类型成员,系统不分配内存空间
struct Node
{
char ch;
typedef union
{
int a;
float f;
}AF;//AF变成了一种类型
};
int main()
{
Node x;
printf("%d \n", sizeof(x));// 1字节
Node::AF y;// y里面有 a 和 f
printf("%d \n", sizeof(y));// 4字节
return 0;
}
结构体与联合体相互套用
结构体与联合体相互套用时非常重要,主要示例:IP地址转换
union Node
{
struct
{
char a;
char b;
};
short sx;
};