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

C语言访问结构体中成员的2种方式(附带示例)

C语言中的结构体是一种复合的数据类型,它允许我们将不同类型的数据项组合在一起,从而形成一个逻辑上的整体。结构体的每个数据项被称为成员,访问结构体成员是一项基本而重要的操作,它使我们能够读取或修改结构体中的数据。
 

在C语言中,我们可以通过「结构体变量」或者「结构体指针」这两种方式来访问结构体成员。
 

为了讲解方便,我们先定义一个结构体类型。假设我们有一个表示学生信息的结构体,包含学号、姓名和成绩三个成员:

struct Student {
    int id;
    char name[50];
    float score;
};

1. 通过结构体变量访问结构体成员

通过结构体变量访问成员是最直接的方法。创建结构体变量以后,可以使用点号运算符.来访问成员,它的语法如下:

结构体变量名.成员名

让我们看一个具体的例子:

struct Student s1;
s1.id = 1001;
strcpy(s1.name, "张三");
s1.score = 85.5;

printf("学号:%d\n", s1.id);
printf("姓名:%s\n", s1.name);
printf("成绩:%.1f\n", s1.score);

输出结果:

学号:1001
姓名:张三
成绩:85.5

在这个例子中,我们通过点运算符直接访问并设置了结构体变量 s1 的各个成员。这种方法简单直观,适用于直接操作结构体变量的场景。

2. 通过结构体指针访问结构体成员

另一种访问结构体成员的方式是通过结构体指针。当我们使用指针来操作结构体时,有两种语法可以选择:

a) 箭头运算符->

箭头运算符(->)是专门为结构体指针设计的,它提供了一种简洁的语法来访问结构体成员。使用箭头运算符的语法如下:

结构体指针->成员名

让我们看一个使用箭头运算符的例子:

struct Student s2 = {1002, "李四", 92.0};
struct Student *ptr = &s2;

printf("学号:%d\n", ptr->id);
printf("姓名:%s\n", ptr->name);
printf("成绩:%.1f\n", ptr->score);

ptr->score = 95.5;  // 修改成绩
printf("更新后的成绩:%.1f\n", ptr->score);

输出结果:

学号:1002
姓名:李四
成绩:92.0
更新后的成绩:95.5

在这个例子中,我们通过箭头运算符轻松地访问和修改了结构体成员。

b) 解引用运算符 * 配合点运算符 .

除了箭头运算符,我们还可以使用「解引用运算符*配合点运算符.」的方式,其语法如下:

(*结构体指针).成员名

这种方法在功能上等同于箭头运算符,但在语法上略显复杂。括号在这里是必需的,因为点运算符的优先级高于指针解引用。如果没有括号,编译器会尝试先访问指针的成员,而不是指针所指向的结构体的成员,这会导致错误。


让我们看一个使用间接成员访问的例子:

struct Student s3 = {1003, "王五", 88.5};
struct Student *ptr2 = &s3;

printf("学号:%d\n", (*ptr2).id);
printf("姓名:%s\n", (*ptr2).name);
printf("成绩:%.1f\n", (*ptr2).score);

(*ptr2).score = 90.0;  // 修改成绩
printf("更新后的成绩:%.1f\n", (*ptr2).score);

输出结果:

学号:1003
姓名:王五
成绩:88.5
更新后的成绩:90.0

虽然这种方法在功能上与箭头运算符相同,但在实际编程中,箭头运算符因其简洁性而更受欢迎。然而,理解这两种方法都很重要,因为你可能在阅读他人的代码时遇到这两种语法。
 

在选择使用哪种方法访问结构体成员时,主要取决于你是直接操作结构体变量还是通过指针操作结构体。如果直接操作结构体变量,使用点运算符是最直接的方法。如果通过指针操作结构体,箭头运算符通常是最佳选择,因为它简洁明了。

相关文章