箭头运算符(->)
本课属于 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 编程中,通过指针访问结构体成员的标准方式就是使用它。
挑战
简单编写一个 C 程序,演示如何使用箭头运算符通过指针访问结构体成员。程序应完成以下操作:
- 定义一个名为
Book的struct,包含以下成员:- 一个整数
id,用于存储书籍 ID - 一个大小为 40 的字符数组
title,用于存储书名 - 一个大小为 30 的字符数组
author,用于存储作者姓名 - 一个浮点数
price,用于存储书籍价格 - 一个整数
pages,用于存储页数
- 一个整数
- 在主函数中,创建一个名为
myBook的Book变量 - 声明一个指向
Book结构体的指针,名为bookPtr - 将
myBook的地址赋给bookPtr - 读取以下输入值,并通过指针使用箭头运算符将它们赋给结构体成员:
- 读取一个整数作为 ID,并使用
bookPtr->id赋值 - 读取一个字符串作为书名,并使用
bookPtr->title赋值 - 读取一个字符串作为作者姓名,并使用
bookPtr->author赋值 - 读取一个浮点数作为价格,并使用
bookPtr->price赋值 - 读取一个整数作为页数,并使用
bookPtr->pages赋值
- 读取一个整数作为 ID,并使用
- 读取所有值后,使用箭头运算符执行以下操作:
- 给价格打 10% 的折扣:
bookPtr->price = bookPtr->price * 0.9; - 增加 50 页赠送页数:
bookPtr->pages += 50;
- 给价格打 10% 的折扣:
- 使用箭头运算符访问各个成员,并按照以下确切格式打印书籍信息:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- 使用箭头运算符计算并打印每页价格,格式为:
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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器