第十七章——结构体(struct)

1. 结构体

结构是 C 编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。

假如我们要定义一个有关日期格式的数据类型,可能会用到以下几个数据:

  • year
  • month
  • date
  • hour
  • minute
  • second

那么我们该如何定义这样一个自定义的数据类型呢。

2. 定义结构体

为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag
{
    member-list
    member-list
    member-list
    ...
} variable-list;

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。

下面是声明 Time 结构的方式:

struct Time
{
    int year;
    int month;
    int date;
    int hour;
    int minute;
    int second;
} now;

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。

下面是三个定义结构的实例:

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
    int a;
    char b;
    double c;
} s1;
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
   int a;
   char b;
   double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;

3. 结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

下面是一个初始化结构体的实例:

#include <stdio.h>

struct Time {
    int year;
    int month;
    int date;
    int hour;
    int minute;
    int second;
} now = {2022, 2, 5, 12, 30, 0};

int main() {
    printf("%d-%d-%d %d:%d:%d\n", now.year, now.month, now.date, now.hour,
           now.minute, now.second);
    return 0;
}

4. 结构体作为函数参数

下面是一个结构体作为函数参数的实例:

#include <stdio.h>

struct Time {
    int year;
    int month;
    int date;
    int hour;
    int minute;
    int second;
} now = {2022, 2, 5, 12, 30, 0};

void getTime(struct Time time) {
    printf("%d-%d-%d %d:%d:%d\n", time.year, time.month, time.date, time.hour,
           time.minute, time.second);
}

int main() {
    getTime(now);
    return 0;
}

总之,结构体作为一种用户自定义的数据类型同其他数据类型一样,具有同等的功能,可以作为参数,可以作为返回值,可以使用指针,可以创建数组等等,这里仅作简单介绍,更多内容可自行学习。