联合(Union)
在C语言中,联合(Union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,但是只能同时使用其中一个成员。联合的主要用途是节省内存,因为它允许不同的数据类型共享同一段内存。
联合的定义
联合的定义使用union
关键字,后面跟着联合的名称和联合成员的定义。例如:
union Data {
int i;
float f;
char str[20];
};
这里,Data
类型的联合可以存储一个整数、一个浮点数或者一个字符数组,但是这些成员共享同一段内存。
联合的使用
要访问联合的成员,可以像访问结构的成员一样使用点(.
)运算符
union Data data;
data.i = 10;
data.f = 220.5;
strcpy(data.str, "C Programming");
同时,由于所有成员共享同一段内存,所以给联合的一个成员赋值会覆盖其他成员的值。
联合的大小
联合的大小是其最大成员的大小,这是因为联合的所有成员都存储在同一个内存位置,所以联合的大小需要足够大,以存储其最大的成员。
联合的用途
联合主要用于节省内存,特别是在需要存储不同类型数据但又不需要同时使用它们的情况下。例如,在嵌入式系统或任何内存受限的环境中,使用联合可以有效地利用有限的内存资源。
举个例子:
#include <stdio.h>
#include <string.h>
// 定义联合
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 访问联合的成员
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 220.5;
printf("data.f: %f\n", data.f);
strcpy(data.str, "oh yeah");
printf("data.str: %s\n", data.str);
// 展示联合的大小
printf("联合Data的大小: %lu bytes\n", sizeof(union Data));
// 节省内存
union Data example;
example.i = 50; // 存储整数
// 使用同一个联合存储字符串,之前的整数值被覆盖
strcpy(example.str, "Memory saver");
printf("example.str: %s\n", example.str);
return 0;
}
代码运行后在终端输出:
data.i: 10
data.f: 220.500000
data.str: oh yeah
联合Data的大小: 20 bytes
example.str: Memory saver
枚举(Enum)
在C语言中,枚举是一种基本数据类型,它允许程序员定义变量的集合,这些变量只能取预定义的一组整数值中的一个,枚举类型的主要优点在于它增加了程序的可读性,使得代码更加清晰易懂。
定义枚举
枚举类型是通过enum
关键字定义的,后面跟着枚举类型的名称和用花括号括起来的一组枚举常量(也称为枚举成员):
enum colors {RED, GREEN, BLUE};
这里,colors
是一个枚举类型,它有三个枚举常量:RED
、GREEN
和BLUE
。默认情况下,枚举常量的值从0开始依次递增,但也可以在定义时显式指定某个枚举常量的值。
枚举的使用
枚举常量在编译时会被替换为对应的整数值,这使得它们可以被用作整型变量的值:
enum colors Color = RED;
这里,myColor
变量被赋值为RED
枚举常量的整数值,默认情况下为0。
举个例子
无限循环打印枚举结构中的内容
#include <stdio.h>
#include <unistd.h> // Windows使用 _sleep
// 定义枚举类型
enum colors {RED, GREEN, YELLOW};
int main() {
enum colors trafficLight = RED; // 从红灯开始无限循环
while (1) {
switch (trafficLight) {
case RED:
printf("红灯停\n");
sleep(2); // 暂停2秒
trafficLight = GREEN; // 切换到绿灯
break;
case GREEN:
printf("绿灯行\n");
sleep(2); // 暂停2秒
trafficLight = YELLOW; // 切换到黄灯
break;
case YELLOW:
printf("黄灯亮了等一会\n");
sleep(2); // 暂停2秒
trafficLight = RED; // 切换回红灯
break;
}
}
return 0;
}
共享名称空间
在C语言中,名称空间(Namespace)是一个抽象的概念,用于区分不同作用域中相同名称的实体,虽然C语言本身没有直接使用“名称空间”这个术语,但它通过作用域
和链接性(linkage)
等机制来管理名称的可见性和冲突。共享名称空间主要指的是在特定作用域内,某些类型的标识符共享同一个名称空间。具体来说,结构标记(struct tags)
、联合标记(union tags)
和枚举标记(enum tags)
在相同作用域内共享同一个名称空间,这意味着在同一作用域内不能定义两个同名的结构、联合或枚举类型(尽管它们的变量名可以与标记名相同,因为变量名属于另一个名称空间)。
举个例子
#include <stdio.h>
typedef struct {
double x;
double y;
} rect;
int main() {
// 定义结构体类型的变量
rect Rect = {10.0, 20.0};
// 定义整型变量
int rect = 5;
printf("结构体的值: (%f, %f)\n", Rect.x, Rect.y);
printf("整数值: %d\n", rect);
return 0;
}
代码输出:
结构体的值: (10.000000, 20.000000)
整数值: 5