当我们需要将不同类型的数据存储在同一内存空间时,可以使用C语言中的共用体(union)。共用体允许多个成员共享同一内存空间。
创建共用体
共用体的创建方式与结构体类似,使用 union
关键字声明,并在大括号中定义成员。
union myUnion {
int i;
float f;
char s[10];
};
以上创建了一个名为 myUnion
的共用体,包含一个 int
类型的成员 i
,一个 float
类型的成员 f
和一个字符数组类型的成员 s
。
访问共用体成员
共用体的成员使用方式与结构体相似,用 .
运算符可以访问共用体的成员。
union myUnion u;
u.i = 10;
printf("i = %d\n", u.i);
u.f = 3.14;
printf("f = %f\n", u.f);
strcpy(u.s, "Hello");
printf("s = %s\n", u.s);
以上代码创建了一个名为 u
的共用体,并依次设置了 i
,f
,s
三个成员的值,并输出。
由于共用体的所有成员共享同一内存空间,对共用体任何一个成员的修改都会影响共用体内的所有成员。
共用体应用示例
1. 破解密码
共用体可以用于破解密码,如将输入的密码使用一个共用体转换成 int
类型,然后与保存的密码进行比较。
union Password {
int i;
char str[5];
};
int main() {
union Password pwd;
pwd.i = 5963;
char input[5];
printf("请输入密码:");
scanf("%s", input);
if (pwd.i == atoi(input)) {
printf("密码正确!\n");
} else {
printf("密码错误!\n");
}
return 0;
}
以上代码创建了一个名为 Password
的共用体,包含一个 int
类型的成员 i
和一个长度为5的字符数组类型的成员 str
。程序通过将 5963
赋值给 i
的方式创建了一个长度为4的密码,并通过 scanf
函数接受用户输入的密码,并通过 atoi
函数将输入的字符转换成 int
类型,然后与 5963
进行比较,判断输入的密码是否正确。
2. 节省内存
共用体还可以用于节省内存,如一个数据结构需要同时存储 int
和 float
类型的变量,但因空间限制只能存储一个变量,此时可以使用共用体。
struct Data {
char name[10];
union {
int i;
float f;
} value;
};
int main() {
struct Data d;
strcpy(d.name, "counter");
d.value.i = 10;
printf("%s = %d\n", d.name, d.value.i);
d.value.f = 3.14;
printf("%s = %f\n", d.name, d.value.f);
return 0;
}
以上代码创建了一个名为 Data
的结构体,包含一个长度为10的字符数组类型的成员 name
和一个以共用体作为类型的成员 value
,value
成员包含一个 int
类型的成员 i
和一个 float
类型的成员 f
。程序通过将 10
赋值给 i
的方式,将 "counter"
赋值给 name
的方式同时存储了一个 int
类型和一个 char
类型的变量,通过将 3.14
赋值给 f
的方式,改为存储了一个 float
类型的变量,并分别输出存储在 Data
结构体中的两种不同类型的变量。