So sánh con trỏ
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 10 trên 63.
Bạn đã học cách di chuyển trong mảng bằng phép toán con trỏ. Bây giờ, bạn sẽ khám phá rằng con trỏ cũng có thể được so sánh bằng các toán tử quan hệ giống như khi dùng với các biến thông thường: ==, !=, < và >.
Khi so sánh hai con trỏ, bạn đang so sánh địa chỉ bộ nhớ của chúng. Điều này đặc biệt hữu ích khi cả hai con trỏ đều trỏ đến các phần tử trong cùng một mảng, vì nó giúp bạn xác định vị trí tương đối của chúng trong bộ nhớ.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Trỏ đến phần tử (element) đầu tiên
int *end = numbers + 4; // Trỏ đến phần tử cuối cùng
if (start < end) {
printf("start comes before end in memory");
}So sánh con trỏ đặc biệt hữu ích trong điều kiện vòng lặp. Thay vì dùng biến đếm, bạn có thể so sánh vị trí con trỏ hiện tại với con trỏ đích để xác định khi nào vòng lặp nên dừng. Cách này giúp bạn viết code duyệt mảng gọn gàng và hiệu quả.
Điểm mấu chốt là ptr1 < ptr2 cho bạn biết ptr1 trỏ đến một phần tử nằm trước phần tử mà ptr2 trỏ đến trong mảng. Mối quan hệ này khiến việc so sánh con trỏ trở thành lựa chọn tự nhiên để điều khiển các vòng lặp xử lý mảng tuần tự.
Thử thách
DễViết chương trình C sử dụng phép so sánh con trỏ để duyệt mảng và tìm các phần tử nằm trong một phạm vi cụ thể. Chương trình cần:
- Khai báo một mảng số nguyên tên là
scoresgồm 8 phần tử và khởi tạo mảng bằng các giá trị {45, 78, 92, 63, 87, 34, 91, 56} - Khai báo hai con trỏ đến số nguyên:
start_ptrvàend_ptr - Đặt
start_ptrtrỏ đến phần tử đầu tiên của mảng - Đặt
end_ptrtrỏ đến phần tử cuối cùng của mảng bằng phép toán con trỏ - Khai báo một con trỏ tên là
current_ptrvà khởi tạo để nó trỏ đến phần tử đầu tiên - Dùng vòng lặp while với phép so sánh con trỏ (
current_ptr <= end_ptr) để duyệt mảng - Bên trong vòng lặp:
- Kiểm tra xem giá trị hiện tại có nằm trong khoảng từ 60 đến 90, bao gồm cả hai giá trị này, hay không
- Nếu giá trị nằm trong phạm vi, in chính xác
Value [value] is in range - Nếu giá trị không nằm trong phạm vi, in chính xác
Value [value] is out of range - Tăng
current_ptrđể chuyển đến phần tử tiếp theo
- Sau vòng lặp, dùng phép so sánh con trỏ để xác minh rằng
current_ptrhiện đã vượt qua cuối mảng bằng cách kiểm tra xemcurrent_ptr > end_ptr - Nếu điều kiện đúng, in chính xác
Traversal complete
Đầu ra của bạn cần hiển thị kết quả theo định dạng sau:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeThử thách này kiểm tra mức độ hiểu của bạn về các toán tử so sánh con trỏ trong điều kiện vòng lặp, cách dùng phép toán con trỏ để thiết lập các con trỏ giới hạn và cách phép so sánh con trỏ có thể điều khiển việc duyệt mảng gọn gàng hơn so với vòng lặp truyền thống dựa trên bộ đếm.
Tự làm thử
#include <stdio.h>
int main() {
// TODO: Viết code bên dưới
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àm3Mả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