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.xGiờ đâ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ả.
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:
- Định nghĩa một
structcó tênProductvớ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ự
namecó 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
- Một số nguyên
- Trong hàm main, tạo một biến
Productcó tênitemvà 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
- Khai báo một con trỏ đến struct
Productcó tênitemPtr - Gán địa chỉ của biến
itemchoitemPtrbằng toán tử lấy địa chỉ - 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]
- 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]
- 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;
}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