c语言中struct,enum,typedef struct和typedef enum使用方法介绍

struct

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

结构体有大致三种声明方法:

只有定义

struct student{
		char name[10];
		int age;
		float height;
};

注意最后一行};这里的;不能省略.

当你要使用这个结构体的使用,可以有两种方法:

  1. 定义变量的时候初始化
int main(){
    struct student stu1 = {"Mike",10,169.5};
    printf("%s is %d years old, but he is %.1f cm",stu1.name,stu1.age,stu1.height);
    return 0;
}

运行结果为:
在这里插入图片描述
这里需要注意,{ }中的内容需要和定义的结构体的顺序相对应.
2. 定义变量的时候不初始化,后续初始化:

int main(){
    struct student stu1;
    stu1.age = 10;
    strcpy(stu1.name,"Mike");
    stu1.height = 169.5;

    printf("%s is %d years old, but he is %.1f cm",stu1.name,stu1.age,stu1.height);
    return 0;
}

运行结果为:
在这里插入图片描述
这里需要注意,当你定义name的时候,如果是char name[10]之类的,在后续使用的时候,不能直接stu1.name = "Mike",必须用strcpy(stu1.name,"Mike"). 但是在定义结构体的时候,如果是char *name,就可以直接使用stu1.name = "Mike"

附加结构体变量

struct student{
		char name[10];
		int age;
		float height;
}stu1;

这种定义方式其实就是将两步合为一步:

struct student{
		char name[10];
		int age;
		float height;
};
struct stuendt stu1;

所以同样的,使用的时候也有两种方式,一种是直接定义初始化,一种是后续定义数据.

struct student{
		char name[10];
		int age;
		float height;
}stu1 = {"Mike",10,169.5};

匿名结构体

还有一种,如果你只用这个结构体的一个变量的时候,你就可以使用匿名结构体.

struct {
		char name[10];
		int age;
		float height;
}stu1;

这样子定义后,这个结构体只有stu1一个变量.

enum

枚举(enum)是英文enumerate的缩写. 枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性. 每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从0开始.

枚举语法的定义格式为:
enum 枚举名 { 枚举元素i...};

举个例子:
定义一个星期的7天,如果不使用枚举,就只能用#define给每个整数定义一个别名:

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7

但是如果使用枚举:

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};

注意,如果没有MON=1,那么MON的值就默认为0,后续依次加一,但如果加了,则MON的值为1,后续还是依次加一.

枚举变量的定义和struct类似,也有三种方式:

先定义enum,在定义变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

定义enum的同时定义变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

省略枚举名称,直接定义变量

enum
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

枚举元素一般情况下是没有办法遍历的,但是在某些特殊情况下,是可以进行遍历的.

#include 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++) {
        printf("枚举元素:%d \n", day);
    }
}

运行结果为:
c语言中struct,enum,typedef struct和typedef enum使用方法介绍_第1张图片

在了解typedef struct和typedef enum之前,我们先了解typedef的作用. C语言里typedef的解释是用来声明新的类型名来代替已有的类姓名。
例如:typedef int CHANGE;
指定了用CHANGE代表int类型,CHANGE代表int,那么:int a,b;CHANGE a,b;是等价的、一样的。方便了个人习惯,熟悉的人用CHANGE来定义int。
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct,enum等)。

typedef struct和typedef enum

有了上述对typedef的理解,我们再来理解typedef struct和typedef enum就比较容易了.

用typedef enum举例:

typedef enum workday1//此处workday1是枚举类型的名字,这里的workday1是可以省略的
{
    saturday,
    sunday = 0,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
} workday2; //此处的workday2为枚举型enum workday的别名
workday2 today, tomorrow; //变量today和tomorrow的类型为枚举型workday2,即enum workday1

由于workday1是可以省略的,所以我们这样子也是一样的:

typedef enum 
{
    saturday,
    sunday = 0,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
} workday; 
workday today, tomorrow; 

需要注意的是,同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

  1. 存在同名的枚举类型
typedef enum
{
wednesday,
thursday,
friday
} workday;
typedef enum WEEK
{
saturday,
sunday = 0,
monday,
} workday;
  1. 存在同名的枚举成员
typedef enum
{
wednesday,
thursday,
friday
} workday_1;
typedef enum WEEK
{
wednesday,
sunday = 0,
monday,
} workday_2;

你可能感兴趣的:(c语言,开发语言)