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
虽然这种方法在功能上与箭头运算符相同,但在实际编程中,箭头运算符因其简洁性而更受欢迎。然而,理解这两种方法都很重要,因为你可能在阅读他人的代码时遇到这两种语法。
在选择使用哪种方法访问结构体成员时,主要取决于你是直接操作结构体变量还是通过指针操作结构体。如果直接操作结构体变量,使用点运算符是最直接的方法。如果通过指针操作结构体,箭头运算符通常是最佳选择,因为它简洁明了。