Menu
CoddyTech

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->member

Cá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.

challenge icon

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:

  1. Định nghĩa một struct có tên Book vớ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ự title có kích thước 40 để lưu tiêu đề sách
    • Một mảng ký tự author có 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
  2. Trong hàm main, tạo một biến Book có tên myBook
  3. Khai báo một con trỏ đến struct Book có tên bookPtr
  4. Gán địa chỉ của myBook cho bookPtr
  5. Đọ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
  6. 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;
  7. 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]
  8. 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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online