2

十二、类型定义和结构体

 2 years ago
source link: https://www.techstack.tech/post/%E5%8D%81%E4%BA%8C%E3%80%81%E7%B1%BB%E5%9E%8B%E5%AE%9A%E4%B9%89%E5%92%8C%E7%BB%93%E6%9E%84%E4%BD%93/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

十二、类型定义和结构体

发表于2021-12-24|更新于2021-12-24|C语言入门手册
字数总计:1.1k|阅读时长:3分钟|阅读量:1|评论数:0

C 中的 typedef 关键字允许你定义新的类型。

我们可以从 C 内置的类型开始创建自己的类型,使用这个语法:

typedef existingtype NEWTYPE

按照惯例,我们创建的新类型通常是大写的。

这样可以更加容易区分它,并且可以立即识别出它是一种类型。

例如,我们可以定义一个新的 NUMBER 类型,它还是 int

typedef int NUMBER

一旦你这么做了之后,你就可以定义新的 NUMBER 变量了:

NUMBER one = 1;

现在你可能会问:为什么?为什么不直接使用内置的 int 类型呢?

嗯,当两个东西搭配在一起的时候,typedef 会变得真的很有用:枚举类型和结构体。

使用 typedefenum 关键字,我们可以定义具有指定值的类型。

这是 typedef 关键字最重要的使用场景之一。

这是枚举类型的语法:

typedef enum {
//值……
}

按照惯例,我们创建的枚举类通常是大写的。

这里是一个简单的示例:

typedef enum {
true,
false
} BOOLEAN;

C 自带 bool 类型,所以这个示例并不实用,但是它会让你领悟到其中的精髓。

另一个示例是定义一周中的那几个日子:

typedef enum {
monday,
tuesday,
wednesday,
thursday,
friday,
saturday,
sunday
} WEEKDAY;

这里是使用这个枚举类的一个简单程序:

#include <stdio.h>

typedef enum {
monday,
tuesday,
wednesday,
thursday,
friday,
saturday,
sunday
} WEEKDAY;

int main(void) {
WEEKDAY day = monday;

if (day == monday) {
printf("It's monday!");
} else {
printf("It's not monday");
}
}

枚举定义中的每个枚举项在内部都与一个整数配对。所以在这个示例中 monday 是 0,tuesday 是 1,以此类推。

这意味着对应的条件可以是 if (day == 0) 而不是 if (day == monday),但是对于我们人类来说,使用名字比数字更合理,所以它是一个非常便利的语法。

利用 struct 关键字,我们可以使用基本的 C 类型创建复杂的数据结构。

结构体是一组由不同类型的值组成的集合。C 中的数组被限制为一种类型,所以结构体在很多用例中会显得非常有趣。

这里是结构体的语法:

struct <structname> {
//变量……
};
struct person {
int age;
char *name;
};

通过将变量添加到右花括号之后,分号之前,你可以声明类型为该结构体的变量,就像这样:

struct person {
int age;
char *name;
} flavio;

或者多个变量也行,就像这样:

struct person {
int age;
char *name;
} flavio, people[20];

这次我声明一个名为 flavioperson 变量,以及一个具有 20 个 person 的名为 people 的数组。

我们也可以稍后再声明变量,使用这个语法:

struct person {
int age;
char *name;
};

struct person flavio;

我们可以在声明的时候初始化一个结构体:

struct person {
int age;
char *name;
};

struct person flavio = { 37, "Flavio" };

一旦定义了结构体,我们就可以使用一个点(.)来访问它里面的值了:

struct person {
int age;
char *name;
};

struct person flavio = { 37, "Flavio" };
printf("%s, age %u", flavio.name, flavio.age);

我们也可以使用点语法改变结构体中的值:

struct person {
int age;
char *name;
};

struct person flavio = { 37, "Flavio" };

flavio.age = 38;

结构体非常有用,因为它们既可以作为函数的参数,也可以作为函数的返回值,以及它们内部的嵌入变量。每个变量都有一个标签。

注意到结构体是 复制传递 的,这一点很重要,除非,当然你可以传递一个指向结构体的指针,这种情况下它就是引用传递。

使用 typedef,我们可以简化处理结构体时的代码。

咱们看一个示例:

typedef struct {
int age;
char *name;
} PERSON;

按照惯例,我们使用 typedef 创建的结构体通常是大写的。

现在,我们可以像这样声明一个新的 PERSON 变量:

PERSON flavio;

并且我们可以用这种方式在声明的时候初始化它们:

PERSON flavio = { 37, "Flavio" };

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK