Menu
CoddyTech

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ự.

challenge icon

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:

  1. Khai báo một mảng số nguyên tên là scores gồ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}
  2. Khai báo hai con trỏ đến số nguyên: start_ptr và end_ptr
  3. Đặt start_ptr trỏ đến phần tử đầu tiên của mảng
  4. Đặt end_ptr trỏ đến phần tử cuối cùng của mảng bằng phép toán con trỏ
  5. Khai báo một con trỏ tên là current_ptr và khởi tạo để nó trỏ đến phần tử đầu tiên
  6. Dùng vòng lặp while với phép so sánh con trỏ (current_ptr <= end_ptr) để duyệt mảng
  7. 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
  8. Sau vòng lặp, dùng phép so sánh con trỏ để xác minh rằng current_ptr hiện đã vượt qua cuối mảng bằng cách kiểm tra xem current_ptr > end_ptr
  9. 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 complete

Thử 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;
}
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