Menu
CoddyTech

箭头运算符(->)

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 45 课,共 63 课。

处理指向结构体的指针时,访问结构体成员需要使用特殊语法。虽然你可以同时使用解引用运算符和点表示法,但 C 提供了一个专门用于此目的、更方便的运算符:箭头运算符(->)。

箭头运算符可以让你通过指针以简洁易读的方式访问结构体成员:

ptr->member

这等同于写成 (*ptr).member,但简洁得多。

下面来看它在实际中的用法:

struct Point p1 = {10, 20};
struct Point *ptr = &p1;

// 使用箭头运算符
printf("x = %d, y = %d\n", ptr->x, ptr->y);

// 这等同于:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);

箭头运算符能让代码更简洁、更易读,尤其是在处理复杂数据结构时。在 C 编程中,通过指针访问结构体成员的标准方式就是使用它。

challenge icon

挑战

简单

编写一个 C 程序,演示如何使用箭头运算符通过指针访问结构体成员。程序应完成以下操作:

  1. 定义一个名为 Book 的 struct,包含以下成员:
    • 一个整数 id,用于存储书籍 ID
    • 一个大小为 40 的字符数组 title,用于存储书名
    • 一个大小为 30 的字符数组 author,用于存储作者姓名
    • 一个浮点数 price,用于存储书籍价格
    • 一个整数 pages,用于存储页数
  2. 在主函数中,创建一个名为 myBook 的 Book 变量
  3. 声明一个指向 Book 结构体的指针,名为 bookPtr
  4. 将 myBook 的地址赋给 bookPtr
  5. 读取以下输入值,并通过指针使用箭头运算符将它们赋给结构体成员:
    • 读取一个整数作为 ID,并使用 bookPtr->id 赋值
    • 读取一个字符串作为书名,并使用 bookPtr->title 赋值
    • 读取一个字符串作为作者姓名,并使用 bookPtr->author 赋值
    • 读取一个浮点数作为价格,并使用 bookPtr->price 赋值
    • 读取一个整数作为页数,并使用 bookPtr->pages 赋值
  6. 读取所有值后,使用箭头运算符执行以下操作:
    • 给价格打 10% 的折扣:bookPtr->price = bookPtr->price * 0.9;
    • 增加 50 页赠送页数:bookPtr->pages += 50;
  7. 使用箭头运算符访问各个成员,并按照以下确切格式打印书籍信息:
    • Book Information:
    • ID: [id]
    • Title: [title]
    • Author: [author]
    • Price: [price]
    • Pages: [pages]
  8. 使用箭头运算符计算并打印每页价格,格式为:Price per page: [price_per_page]

这个挑战将检验你对箭头运算符的理解,看看你是否会用它通过指针访问结构体成员。你将练习使用 ptr->member 语法读取和写入结构体成员,并了解它与 (*ptr).member 等效,但更方便、易读。

亲手试试

#include <stdio.h>
#include <string.h>

// TODO: 在这里定义 Book 结构体

int main() {
    // TODO: 创建一个名为 myBook 的 Book 变量
    
    // TODO: 声明一个名为 bookPtr、指向 Book 的指针
    
    // TODO: 将 myBook 的地址赋值给 bookPtr
    
    // 读取输入值
    int id;
    char title[40];
    char author[30];
    float price;
    int pages;
    
    scanf("%d", &id);
    scanf("%s", title);
    scanf("%s", author);
    scanf("%f", &price);
    scanf("%d", &pages);
    
    // TODO: 使用箭头运算符将输入值赋给结构体成员
    
    // TODO: 使用箭头运算符给 price 打 9 折
    
    // TODO: 使用箭头运算符额外增加 50 页
    
    // TODO: 使用箭头运算符输出图书信息
    
    // TODO: 使用箭头运算符计算并输出每页价格
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器