在 C 语言中,我们有一种称为 struct 的结构体,它是一种用户自定义的类型,可以包含多块数据,且这些数据可能属于不同的类型。
这是一种方便的方式,将多个变量打包成一个单一变量。这对传递变量给函数很有帮助(这样你只需传递一个变量,而不是多个),并且有助于组织数据,使代码更易读。
如果你来自其他语言,可能会熟悉类(classes)和对象(objects)的概念。C 语言本身没有这些概念。你可以把 struct 看作是只有数据成员而没有方法的类。
你可以这样在代码中声明一个 struct:
struct car {
char *name;
float price;
int speed;
};
这通常是在全局作用域外的函数之外完成的,这样 struct 就是全局可用的。
当你这样做时,就创建了一个新的类型。完整的类型名称是 struct car。(只有 car 是不行的。)
目前还没有这个类型的变量,但我们可以声明一些:
struct car saturn; // 类型为 "struct car" 的变量 "saturn"
现在我们有一个未初始化的变量 saturn,类型是 struct car。
我们应该初始化它!但是我们如何给这些字段赋值呢?
像许多从 C 那里借用的语言一样,我们使用点操作符(.)来访问各个字段。
saturn.name = "Saturn SL/2";
saturn.price = 15999.99;
saturn.speed = 175;
printf("Name: %s\\n", saturn.name);
printf("Price (USD): %f\\n", saturn.price);
printf("Top Speed (km): %d\\n", saturn.speed);
前面几行中,我们给 struct car 中的字段赋值,接下来打印这些值。
上节中的例子有些笨重。肯定有更好的方法来初始化那个 struct 变量!
你可以用初始化器在定义变量时按字段在 struct 中出现的顺序赋值。(这在变量定义之后无法使用,必须在定义时完成。)
struct car {
char *name;
float price;
int speed;
};
// 现在用初始化器!字段顺序与 struct 声明时相同:
struct car saturn = {"Saturn SL/2", 16000.99, 175};
printf("Name: %s\\n", saturn.name);
printf("Price: %f\\n", saturn.price);
printf("Top Speed: %d km\\n", saturn.speed);
初始化器中的字段必须按顺序出现,这点有点令人头疼。如果有人改变了 struct car 中字段的顺序,可能会导致所有其他代码出错!