Toán tử mũi tên (->)
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 45 trên 63.
Khi làm việc với con trỏ trỏ đến struct, bạn cần dùng cú pháp đặc biệt để truy cập các thành viên của struct. Bạn có thể kết hợp toán tử giải tham chiếu với ký hiệu dấu chấm, nhưng C cung cấp một toán tử tiện lợi hơn dành riêng cho mục đích này: toán tử mũi tên (->).
Toán tử mũi tên cho phép bạn truy cập các thành viên của struct thông qua con trỏ một cách gọn gàng, dễ đọc:
ptr->memberCách viết này tương đương với (*ptr).member, nhưng ngắn gọn hơn nhiều.
Sau đây là cách hoạt động trong thực tế:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Dùng toán tử mũi tên (arrow operator)
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Cách này tương đương với:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Toán tử mũi tên giúp code của bạn gọn gàng và dễ đọc hơn, đặc biệt khi làm việc với các cấu trúc dữ liệu phức tạp. Đây là cách tiêu chuẩn để truy cập các thành viên của struct thông qua con trỏ trong lập trình C.
Thử thách
DễTạo một chương trình C minh họa cách dùng toán tử mũi tên (arrow operator) để truy cập các thành viên của struct thông qua con trỏ. Chương trình của bạn cần:
- Định nghĩa một
structcó tênBookvới các thành viên sau:- Một số nguyên
idđể lưu ID của sách - Một mảng ký tự
titlecó kích thước 40 để lưu tiêu đề sách - Một mảng ký tự
authorcó kích thước 30 để lưu tên tác giả - Một số thực
priceđể lưu giá sách - Một số nguyên
pagesđể lưu số trang
- Một số nguyên
- Trong hàm main, tạo một biến
Bookcó tênmyBook - Khai báo một con trỏ đến struct
Bookcó tênbookPtr - Gán địa chỉ của
myBookchobookPtr - Đọc các giá trị đầu vào sau và gán chúng cho các thành viên của struct bằng toán tử mũi tên thông qua con trỏ:
- Đọc một số nguyên cho ID và gán bằng
bookPtr->id - Đọc một chuỗi cho tiêu đề và gán bằng
bookPtr->title - Đọc một chuỗi cho tác giả và gán bằng
bookPtr->author - Đọc một số thực cho giá và gán bằng
bookPtr->price - Đọc một số nguyên cho số trang và gán bằng
bookPtr->pages
- Đọc một số nguyên cho ID và gán bằng
- Sau khi đọc tất cả giá trị, thực hiện các thao tác sau bằng toán tử mũi tên:
- Giảm giá 10%:
bookPtr->price = bookPtr->price * 0.9; - Cộng thêm 50 trang thưởng:
bookPtr->pages += 50;
- Giảm giá 10%:
- In thông tin sách bằng toán tử mũi tên để truy cập từng thành viên theo đúng định dạng sau:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Tính và in giá mỗi trang bằng toán tử mũi tên theo định dạng:
Price per page: [price_per_page]
Thử thách này kiểm tra mức độ hiểu biết của bạn về cách dùng toán tử mũi tên để truy cập các thành viên của struct thông qua con trỏ. Bạn sẽ luyện tập cú pháp ptr->member để đọc và ghi các thành viên của struct, đồng thời thấy rằng cú pháp này tương đương với (*ptr).member nhưng tiện lợi và dễ đọc hơn nhiều.
Tự làm thử
#include <stdio.h>
#include <string.h>
// TODO: Định nghĩa struct Book tại đây
int main() {
// TODO: Tạo biến Book tên là myBook
// TODO: Khai báo con trỏ tới Book tên là bookPtr
// TODO: Gán địa chỉ của myBook cho bookPtr
// Đọc các giá trị đầu vào
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: Dùng toán tử mũi tên để gán các giá trị đầu vào cho các thành viên của struct
// TODO: Dùng toán tử mũi tên để giảm price đi 10%
// TODO: Dùng toán tử mũi tên để cộng thêm 50 trang thưởng
// TODO: Dùng toán tử mũi tên để in ra thông tin sách
// TODO: Dùng toán tử mũi tên để tính và in ra giá mỗi trang
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm8Cấu trúc và con trỏ
Con trỏ đến cấu trúcToán tử mũi tên (->)Truyền cấu trúc theo giá trịTruyền con trỏ cấu trúcCấp phát động cho cấu trúcÔn tập: sửa đổi cấu trúc bằng con trỏ3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online