Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第八章 结构体指针

本章要点

第五章学习了结构体——用 . 运算符访问成员。但如果手里拿的不是结构体本身,而是指向结构体的指针,该怎么操作?

本章回答这个问题。核心内容就一个运算符:

  • 箭头运算符 ->p->name 等价于 (*p).name,专门用于通过结构体指针访问成员
  • 结构体变量用 .,结构体指针用 ->——不能混用
  • 结合指针运算遍历结构体数组

-> 是 C 语言中使用频率最高的运算符之一。掌握了它,后续章节中链表、动态数据结构的大量代码才能顺畅读写。


前面学过,用 . 访问结构体成员:stu.name。但如果手里拿的是指向结构体的指针而非结构体本身,该怎么办?

根据指针的基本原理,需要先解引用再取成员:

struct Student *p = &stu;
printf("%s\n", (*p).name);  // 先 *p 得到结构体,再 .name

这种写法括号加星号加点的组合很繁琐。C 语言为此提供了箭头运算符 ->

p->name    // 等价于  (*p).name

-> 左侧是结构体指针,右侧是成员名,两者之间不能有空格。读作“p 所指向的那个结构体的 name 成员“。

#include <stdio.h>

struct Student
{
    char name[20];
    int age;
    float score;
};

int main(void)
{
    struct Student stu = {"小明", 18, 92.5};
    struct Student *p = &stu;

    printf("姓名:%s\n", p->name);   // 读取
    p->age = 19;                      // 修改
    p->score = 95.0;
    printf("年龄:%d,成绩:%.1f\n", p->age, p->score);

    // 遍历结构体数组
    struct Student students[3] = {
        {"小明", 18, 92.5},
        {"小红", 19, 88.0},
        {"小刚", 18, 95.5}
    };
    for (struct Student *ptr = students; ptr < students + 3; ptr++)
        printf("%s %d %.1f\n", ptr->name, ptr->age, ptr->score);

    return 0;
}

规则只有一条:结构体变量用 .,结构体指针用 ->,不能混用。