C语言教程-详解C语言结构体
为什么使用结构体?
在C语言中,存在需要存储实体的多个属性的情况。并不是每个实体都只有一种类型的所有信息。它可以具有不同数据类型的不同属性。例如,一个实体"学生"可能有姓名(字符串)、学号(整数)、分数(浮点数)。为了存储与学生实体相关的此类信息,我们有以下几种方法:
- 构造单独的数组来存储姓名、学号和分数。
- 使用特殊的数据结构来存储不同数据类型的集合。
让我们详细了解第一种方法。
#include <stdio.h>
void main()
{
char names[2][10], dummy; // 使用二维字符数组names来存储学生的姓名
int roll_numbers[2], i;
float marks[2];
for (i = 0; i < 3; i++)
{
printf("Enter the name, roll number, and marks of student %d", i + 1);
scanf("%s %d %f", &names[i], &roll_numbers[i], &marks[i]);
scanf("%c", &dummy); // 在每次迭代中,将换行符存储在dummy字符中
}
printf("Printing the student details...\n");
for (i = 0; i < 3; i++)
{
printf("%s %d %f\n", names[i], roll_numbers[i], marks[i]);
}
}
输出
Enter the name, roll number, and marks of student 1: Arun 90 91
Enter the name, roll number, and marks of student 2: Varun 91 56
Enter the name, roll number, and marks of student 3: Sham 89 69
Printing the student details...
Arun 90 91.000000
Varun 91 56.000000
Sham 89 69.000000
上面的程序可以满足我们存储实体"学生"的信息的要求。然而,该程序非常复杂,并且随着输入的数量增加,复杂性也会增加。每个数组的元素被连续地存储,但并不是所有的数组都必须在内存中连续存储。C语言提供了另一种更简单的方法,可以使用一种特殊的数据结构,即结构体,在该数据结构中,可以将关于实体的所有不同数据类型的信息进行分组。
结构体是什么
在C语言中,结构体是一种用户自定义的数据类型,它使我们能够存储不同数据类型的集合。结构体的每个元素称为成员。结构体可以模拟类和模板的使用,因为它可以存储各种信息。
使用struct关键字来定义结构体。让我们看一下在C语言中定义结构体的语法。
struct structure_name
{
data_type member1;
data_type member2;
.
.
data_type memeberN;
};
让我们看一个在C语言中为"员工"实体定义结构体的示例。
struct employee
{
int id;
char name[20];
float salary;
};
下面的图示展示了在上面的示例中定义的结构体"employee"的内存分配。
这里,struct是关键字,employee是结构体的名称,id、name和salary是结构体的成员或字段。
声明结构体变量
我们可以声明一个结构体变量,以便可以轻松访问结构体的成员。有两种声明结构体变量的方式:
- 使用struct关键字在main()函数内部声明
- 在定义结构体时声明变量。
第一种方式:
让我们看一下使用struct关键字声明结构体变量的示例。它应该在main函数内部声明。
struct employee
{
int id;
char name[50];
float salary;
};
现在将给定的代码写入main()函数内部。
struct employee e1, e2;
变量e1和e2可以用来访问结构体中存储的值。在这里,e1和e2可以像C++和Java中的对象一样对待。
第二种方式:
让我们看另一种在定义结构体时声明变量的方式。
struct employee
{
int id;
char name[50];
float salary;
} e1, e2;
哪种方法更好
如果变量的数量不固定,请使用第一种方法。它为您提供了在main()函数中多次声明结构体变量的灵活性。
如果变量的数量是固定的,请使用第二种方法。这样可以节省在main()函数中声明变量的代码。
访问结构体的成员
有两种访问结构体成员的方式:
- 使用.(成员运算符或点运算符)
- 使用->(结构体指针运算符)
让我们看一下通过.(成员)运算符访问p1变量的id成员的代码。
p1.id
C结构体示例
让我们看一个在C语言中的结构体的简单示例。
#include<stdio.h>
#include<string.h>
struct employee
{
int id;
char name[50];
} e1; // 为结构体声明变量e1
int main()
{
// 存储第一个员工的信息
e1.id = 101;
strcpy(e1.name, "Sonoo Jaiswal"); // 将字符串复制到字符数组中
// 打印第一个员工的信息
printf("Employee 1 ID: %d\n", e1.id);
printf("Employee 1 Name: %s\n", e1.name);
return 0;
}
输出:
Employee 1 ID: 101
Employee 1 Name: Sonoo Jaiswal
让我们看一个在C语言中存储多个员工信息的结构体的另一个示例。
#include<stdio.h>
#include<string.h>
struct employee
{
int id;
char name[50];
float salary;
} e1, e2; // 为结构体声明变量e1和e2
int main()
{
// 存储第一个员工的信息
e1.id = 101;
strcpy(e1.name, "Sonoo Jaiswal");
e1.salary = 56000;
// 存储第二个员工的信息
e2.id = 102;
strcpy(e2.name, "James Bond");
e2.salary = 126000;
// 打印第一个员工的信息
printf("Employee 1 ID: %d\n", e1.id);
printf("Employee 1 Name: %s\n", e1.name);
printf("Employee 1 Salary: %f\n", e1.salary);
// 打印第二个员工的信息
printf("Employee 2 ID: %d\n", e2.id);
printf("Employee 2 Name: %s\n", e2.name);
printf("Employee 2 Salary: %f\n", e2.salary);
return 0;
}
输出:
Employee 1 ID: 101
Employee 1 Name: Sonoo Jaiswal
Employee 1 Salary: 56000.000000
Employee 2 ID: 102
Employee 2 Name: James Bond
Employee 2 Salary: 126000.000000