Menu
CoddyTech

Con trỏ đến cấu trúc

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 44 trên 63.

Giờ bạn đã quen làm việc với các struct, đã đến lúc kết hợp chúng với một khái niệm mạnh mẽ khác trong C: con trỏ. Cũng như bạn có thể tạo con trỏ đến các kiểu dữ liệu cơ bản như int hoặc char, bạn cũng có thể tạo con trỏ lưu địa chỉ của một biến struct.

Cú pháp khai báo con trỏ đến một struct tuân theo cùng mẫu như các khai báo con trỏ khác:

struct StructureName *pointerName;

Ví dụ, với struct Point quen thuộc của chúng ta:

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

Lệnh này tạo một con trỏ có tên ptr có thể lưu địa chỉ của một cấu trúc Point. Để con trỏ thực sự trỏ đến biến cấu trúc của chúng ta, bạn dùng toán tử lấy địa chỉ:

ptr = &p1;

Để đọc một thành viên thông qua con trỏ, hãy giải tham chiếu con trỏ rồi dùng toán tử dấu chấm. Cần có dấu ngoặc đơn vì . liên kết chặt hơn *:

printf("%d", (*ptr).x); // tương tự p1.x

Giờ đây, ptr giữ địa chỉ bộ nhớ của biến struct p1. Điều này mở ra những khả năng mới khi làm việc với struct, đặc biệt là khi truyền chúng cho các hàm hoặc quản lý bộ nhớ một cách linh hoạt. Con trỏ đến struct rất cần thiết để xây dựng các cấu trúc dữ liệu phức tạp hơn và viết chương trình C hiệu quả.

challenge icon

Thử thách

Dễ

Tạo một chương trình C minh họa cách làm việc với con trỏ đến struct. Chương trình của bạn cần:

  1. Định nghĩa một struct có tên Product với các thành viên sau:
    • Một số nguyên id để lưu mã sản phẩm
    • Một mảng ký tự name có kích thước 25 để lưu tên sản phẩm
    • Một số thực price để lưu giá sản phẩm
    • Một số nguyên quantity để lưu số lượng còn lại
  2. Trong hàm main, tạo một biến Product có tên item và khởi tạo biến bằng các giá trị sau:
    • Mã sản phẩm: 501
    • Tên: "Laptop"
    • Giá: 899.99
    • Số lượng: 15
  3. Khai báo một con trỏ đến struct Product có tên itemPtr
  4. Gán địa chỉ của biến item cho itemPtr bằng toán tử lấy địa chỉ
  5. In thông tin sản phẩm ban đầu bằng cách truy cập trực tiếp các thành viên của struct (dùng toán tử dấu chấm) theo đúng định dạng sau:
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. In cùng thông tin sản phẩm bằng cách truy cập các thành viên của struct thông qua con trỏ (dùng toán tử giải tham chiếu kết hợp với ký hiệu dấu chấm: (*itemPtr).member) theo đúng định dạng sau:
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. Xác minh rằng con trỏ trỏ đúng đến struct bằng cách in các địa chỉ bộ nhớ theo đúng định dạng sau:
    • Address of item: [address]
    • Value of itemPtr: [address]
    • Address verification: [result]

Để xác minh địa chỉ, hãy in Match nếu hai địa chỉ giống nhau hoặc No Match nếu chúng khác nhau.

Thử thách này kiểm tra mức độ hiểu của bạn về cách khai báo con trỏ đến struct, gán địa chỉ bằng toán tử lấy địa chỉ và truy cập các thành viên của struct thông qua con trỏ bằng toán tử giải tham chiếu kết hợp với ký hiệu dấu chấm. Bạn cũng sẽ xác minh rằng con trỏ đang lưu đúng địa chỉ của biến struct.

Tự làm thử

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

// TODO: Định nghĩa struct Product tại đây

int main() {
    // TODO: Viết code tại đây
    // 1. Tạo và khởi tạo biến Product 'item'
    // 2. Khai báo con trỏ đến Product tên là 'itemPtr'
    // 3. Gán địa chỉ của 'item' cho 'itemPtr'
    // 4. In ra thông tin sản phẩm ban đầu bằng toán tử dấu chấm
    // 5. In ra thông tin sản phẩm qua con trỏ bằng (*itemPtr).member
    // 6. In ra và kiểm tra các địa chỉ
    
    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