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