首页 > 编程笔记 > C语言笔记

C语言c语言struct用法例子(3个完整例子)

C语言中的 struct(结构体)是一种常用语法,它允许我们将不同类型的数据组合在一起,形成一个新的复合数据类型,这样我们能够更好地组织和管理相关的数据。

在给出 struct 例子之前,让我们先来看一下 struct 的用法。struct 的基本语法格式如下:

struct 结构体名 {
    数据类型1 成员1;
    数据类型2 成员2;
    ...
    数据类型n 成员n;
};

在这个语法格式中,struct 是定义结构体的关键字。结构体名是我们为这个结构体类型指定的名称,可以根据需要自行命名。花括号{ }内部列出了结构体的成员,每个成员都有自己的数据类型和名称。需要注意的是,结构体的定义以分号结尾。
 

结构体定义完成后,我们就可以使用这个新的数据类型来声明变量了。

例子1

让我们从一个简单的例子开始,假设我们要表示一个学生的基本信息:

#include <stdio.h>
#include <string.h>

struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    struct Student student1;
    
    strcpy(student1.name, "张三");
    student1.age = 20;
    student1.gpa = 3.8;
    
    printf("学生姓名:%s\n", student1.name);
    printf("学生年龄:%d\n", student1.age);
    printf("学生 GPA:%.2f\n", student1.gpa);
    
    return 0;
}

输出结果:

学生姓名:张三
学生年龄:20
学生 GPA:3.80

在这个例子中,我们定义了一个名为 Student 的结构体,它包含三个成员:name(字符数组)、age(整数)和 gpa(浮点数)。在 main 函数中,我们声明了一个 Student 类型的变量 student1,然后使用点运算符.来访问和设置结构体的成员。

例子2

结构体的初始化可以在声明时直接进行,这样可以使代码更加简洁。我们可以按照成员的顺序提供初始值,也可以使用指定初始化器来为特定的成员赋值。让我们看一个更复杂的例子,包含结构体的嵌套和初始化:

#include <stdio.h>

struct Date {
    int year;
    int month;
    int day;
};

struct Employee {
    char name[50];
    int id;
    struct Date birthdate;
    struct Date hiredate;
    float salary;
};

int main() {
    struct Employee emp1 = {
        "李四",
        10001,
        {1990, 5, 15},  // 嵌套结构体 birthdate 的初始化
        {2015, 8, 1},   // 嵌套结构体 hiredate 的初始化
        8500.50
    };
    
    struct Employee emp2 = {
        .name = "王五",
        .id = 10002,
        .birthdate = {.year = 1985, .month = 12, .day = 20},
        .hiredate = {.year = 2010, .month = 3, .day = 15},
        .salary = 9200.75
    };
    
    printf("员工 1 信息:\n");
    printf("姓名:%s\n", emp1.name);
    printf("ID:%d\n", emp1.id);
    printf("出生日期:%d-%02d-%02d\n", emp1.birthdate.year, emp1.birthdate.month, emp1.birthdate.day);
    printf("入职日期:%d-%02d-%02d\n", emp1.hiredate.year, emp1.hiredate.month, emp1.hiredate.day);
    printf("薪资:%.2f\n\n", emp1.salary);
    
    printf("员工 2 信息:\n");
    printf("姓名:%s\n", emp2.name);
    printf("ID:%d\n", emp2.id);
    printf("出生日期:%d-%02d-%02d\n", emp2.birthdate.year, emp2.birthdate.month, emp2.birthdate.day);
    printf("入职日期:%d-%02d-%02d\n", emp2.hiredate.year, emp2.hiredate.month, emp2.hiredate.day);
    printf("薪资:%.2f\n", emp2.salary);
    
    return 0;
}

输出结果:

员工 1 信息:
姓名:李四
ID:10001
出生日期:1990-05-15
入职日期:2015-08-01
薪资:8500.50

员工 2 信息:
姓名:王五
ID:10002
出生日期:1985-12-20
入职日期:2010-03-15
薪资:9200.75

在这个更复杂的例子中,我们定义了两个结构体:Date 和 Employee。Employee 结构体包含了两个 Date 类型的成员,展示了结构体的嵌套使用。
 

我们还演示了两种不同的结构体初始化方法:按顺序初始化和使用指定初始化器。指定初始化器的方法特别有用,因为它允许我们以任意顺序初始化成员,并且可以只初始化部分成员,未指定的成员将被自动初始化为 0 或空值。

例子3

结构体还可以作为函数参数传递,或者作为函数的返回值。当结构体作为函数参数时,通常使用指针来传递,以避免复制大量数据,提高效率。例如:

#include <stdio.h>

struct Point {
    int x;
    int y;
};

void movePoint(struct Point *p, int dx, int dy) {
    p->x += dx;
    p->y += dy;
}

int main() {
    struct Point p1 = {10, 20};
    
    printf("移动前:(%d, %d)\n", p1.x, p1.y);
    
    movePoint(&p1, 5, -3);
    
    printf("移动后:(%d, %d)\n", p1.x, p1.y);
    
    return 0;
}

输出结果:

移动前:(10, 20)
移动后:(15, 17)

在这个例子中,我们定义了一个 Point 结构体来表示二维平面上的点,并创建了一个 movePoint 函数来移动这个点。函数接受一个 Point 结构体的指针作为参数,这样我们就可以直接修改原始结构体的内容,而不是操作其副本。在函数内部,我们使用箭头运算符(->)来访问和修改结构体指针所指向的成员。

相关文章