C语言中的联合、枚举、共享名称空间

联合(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是一个枚举类型,它有三个枚举常量:REDGREENBLUE。默认情况下,枚举常量的值从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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值