结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
结构体有大致三种声明方法:
struct student{
char name[10];
int age;
float height;
};
注意最后一行
};
这里的;
不能省略.
当你要使用这个结构体的使用,可以有两种方法:
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)是英文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 DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
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);
}
}
在了解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的理解,我们再来理解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;
需要注意的是,同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:
typedef enum
{
wednesday,
thursday,
friday
} workday;
typedef enum WEEK
{
saturday,
sunday = 0,
monday,
} workday;
typedef enum
{
wednesday,
thursday,
friday
} workday_1;
typedef enum WEEK
{
wednesday,
sunday = 0,
monday,
} workday_2;