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 结构体的指针作为参数,这样我们就可以直接修改原始结构体的内容,而不是操作其副本。在函数内部,我们使用箭头运算符(->)来访问和修改结构体指针所指向的成员。