C语言入门-struct&union&enum&typedef

本文深入探讨了C语言中结构体、联合体、枚举和typedef的用法,详细解释了它们的区别和应用场景。

结构体

 #include <stdio.h>
#include <stdlib.h>
struct Student
{
       long id;//4
       float score;//4
       int age;//4
       char sex;//1
}stud;

main()
{
     
      //struct Student st = {83265209,99.009f,80,'F'};
      //printf("id=%ld\n",st.id);
     
      //printf("结构体的长度为%d\n",sizeof(st));
      //结构体的长度为16(不同的编译器和操作系统可能会有不同的结果)
      //此处把char放置在4个字节内存空间是为了指针更好的向上向下移动
     
      //不同的指针定义
      stud.sex = 'F';
      printf("sex=%c\n",stud.sex);
     
      //结构体指针
      //struct Student (*ps) = &st;
      //printf("sex=%c\n",ps->sex);
      system("pause");
}

联合体

#include <stdio.h>
#include <stdlib.h>
struct
{
      int age;
      char sex;
}st;
// 联合体 是定义一块相同的内存空间 存放里面的数据 
union
{
     int j;int k;int b;double d;
}mix;

main()
{
     
      printf("结构体的长度为%d\n",sizeof(st));
     
     
      printf("联合体的长度为%d\n",sizeof(mix));
     
      // 联合体的作用就是用来表示一组数据类型 数据的数据类型为这一组中的某一种数据类型
      //注意 :   联合体里面的数据内容会相互覆盖
      mix.j = 499;
      printf("mix.k=%d\n",mix.k);//mix.k = 499
     
      system("pause");
}

枚举和typedef

 #include <stdio.h>
#include <stdlib.h>
typedef int myInt;//取别名

enum WeekDay
{
     Monday=9,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday    
}MyDay;
main()
{
      myInt d = 80;
      printf("d=%d\n",d);
     
      enum  WeekDay day = Saturday;
      //可以设置初始值,后续的在此基础上递增
      printf("day=%d\n",day);//day=14
     
      system("pause");
      return 0;
}
<think>好的,我现在需要回答用户关于C语言中typedef enum和typedef struct的区别及用法比较的问题。首先,我得回忆一下这两个概念的基本知识,然后结合提供的引用内容来组织答案。 首先,typedef enum和typedef struct都是用来定义新类型的,但它们分别对应枚举和结构体。我需要明确两者的用途、语法和实际应用中的不同。 根据引用[1],typedef的作用是给现有类型起别名,所以无论是enum还是struct,加上typedef后都可以用新名字来声明变量。比如,typedef enum { ... } MyEnum; 之后,可以直接用MyEnum声明变量,而不需要每次都写enum关键字。 接下来,关于enum和struct本身的区别。枚举(enum)用于定义一组命名的整数常量,而结构体(struct)则是将不同类型的数据组合成一个整体。例如,enum可能用来表示状态码,而struct用来表示一个复杂的数据结构,比如学生信息。 引用[3]提到,typedef可以为内部数据类型和自定义类型(如struct)定义别名。这说明无论是enum还是struct,都可以通过typedef简化声明。例如,typedef struct { ... } MyStruct; 这样声明后,可以直接用MyStruct来定义变量,而不需要写struct关键字。 然后,我需要比较两者的语法和使用场景。枚举类型通常用于有限的、固定的值集合,比如星期、颜色等。而结构体用于组合多个变量,这些变量可以是不同的类型,比如一个学生的姓名、年龄和成绩。 在用法上,typedef enum的例子可能像这样: typedef enum { RED, GREEN, BLUE } Color; Color c = RED; 而typedef struct的例子: typedef struct { int age; char *name; } Person; Person p = {20, "Alice"}; 用户可能还会关心内存分配和访问方式的不同。结构体中的每个成员有独立的内存空间,而枚举的每个成员是整数值,共享同一个类型。 还需要注意,没有typedef的情况下,声明enum变量需要enum关键字,而struct也需要struct关键字。但使用typedef后,这些关键字可以省略,使得代码更简洁。 最后,结合引用[2],可能提到typedef和宏定义的区别,但用户的问题主要在于enum和struct,所以这部分可能不需要深入,除非用户后续提问。 总结起来,回答的结构应该是先介绍typedef的作用,再分别说明typedef enum和typedef struct的用途、语法示例,最后比较两者的区别,包括用途、存储内容和声明方式的不同。</think>### typedef enum与typedef struct的区别及用法比较 #### 1. **核心概念** - **typedef enum**:用于定义**枚举类型**,枚举是一组**命名的整数常量**,常用于表示有限的状态或选项。例如: ```c typedef enum { MONDAY, TUESDAY, WEDNESDAY } Weekday; // 定义枚举类型别名Weekday ``` 使用时可直接声明变量:`Weekday day = MONDAY;`。 - **typedef struct**:用于定义**结构体类型**,结构体是**多个不同类型数据的集合**,常用于封装复杂数据。例如: ```c typedef struct { int id; char name[20]; } Student; // 定义结构体类型别名Student ``` 使用时直接声明:`Student s = {1, "Alice"};`。 #### 2. **语法对比** | 特性 | typedef enum | typedef struct | |---------------------|--------------------------------------------|---------------------------------------------| | **声明方式** | `typedef enum { 成员列表 } 别名;` | `typedef struct { 成员列表 } 别名;` | | **成员类型** | 仅限整数常量(隐式赋值或显式赋值) | 任意类型(int、float、指针等) | | **内存占用** | 单个整型大小(通常4字节) | 各成员内存总和(可能存在对齐填充) | | **典型用途** | 状态码、选项集合(如颜色、星期) | 数据聚合(如学生信息、坐标点) | #### 3. **关键区别** - **数据组织方式**: - **enum**:所有枚举常量共享同一内存空间,本质是整数值的别名。 - **struct**:每个成员独立存储,可通过`.`操作符访问。 - **类型安全**: - 枚举类型(C11后)支持强类型检查,直接赋值整数值可能报错(需强制转换)[^3]。 - 结构体成员需严格按类型访问,但整体无类似限制。 #### 4. **应用示例** - **枚举类型**:定义错误码 ```c typedef enum { SUCCESS = 0, FILE_NOT_FOUND = 1, PERMISSION_DENIED = 2 } ErrorCode; ``` 调用时可直接用`ErrorCode`代替`int`,增强可读性。 - **结构体类型**:定义几何图形 ```c typedef struct { float x; float y; } Point; typedef struct { Point center; float radius; } Circle; ``` 通过嵌套结构体实现复杂数据建模。 #### 5. **联合使用场景** 两者可结合使用,例如用枚举标记结构体的类型: ```c typedef enum { CIRCLE, RECTANGLE } ShapeType; typedef struct { ShapeType type; union { Circle circle; Rectangle rect; } data; } Shape; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值