Menu
CoddyTech

Tên mảng dưới dạng 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 7 trên 63.

Mảng và con trỏ trong C có mối quan hệ đặc biệt, đây là nền tảng để hiểu cách C xử lý dữ liệu trong bộ nhớ. Khi khai báo một mảng, tên mảng hoạt động như một con trỏ hằng trỏ đến phần tử đầu tiên của mảng.

Điều này có nghĩa là khi bạn có một mảng như int numbers[5];, tên numbers về cơ bản là một con trỏ luôn trỏ đến numbers[0]. Bạn có thể xem tên mảng như một con trỏ tích hợp sẵn mà bạn không cần khai báo riêng.

int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' trỏ đến phần tử (element) đầu tiên
// numbers == &numbers[0]  // Hai cách viết này tương đương nhau!

Sự tương đương này rất quan trọng: numbers và &numbers[0] đều cho bạn cùng một địa chỉ bộ nhớ. Tên mảng chỉ là cách thuận tiện hơn để tham chiếu đến địa chỉ của phần tử đầu tiên mà không cần dùng toán tử lấy địa chỉ.

Hiểu mối liên hệ này giúp bạn sử dụng kỹ thuật con trỏ với mảng, nhờ đó code linh hoạt và hiệu quả hơn. Điểm khác biệt chính là tên mảng là con trỏ hằng số, không giống con trỏ thông thường. Bạn không thể thay đổi nơi chúng trỏ đến.

challenge icon

Thử thách

Dễ

Viết một chương trình C minh họa sự tương đương giữa tên mảng và con trỏ đến phần tử đầu tiên của mảng. Chương trình của bạn cần:

  1. Khai báo một mảng số nguyên tên là numbers có 4 phần tử và khởi tạo mảng bằng các giá trị {10, 20, 30, 40}
  2. Khai báo một con trỏ đến số nguyên tên là ptr
  3. Gán tên mảng numbers cho con trỏ ptr
  4. In địa chỉ được lưu trong numbers bằng printf với bộ chỉ định định dạng %p
  5. In địa chỉ của phần tử đầu tiên &numbers[0] bằng printf với bộ chỉ định định dạng %p
  6. In địa chỉ được lưu trong ptr bằng printf với bộ chỉ định định dạng %p
  7. In giá trị của phần tử đầu tiên bằng tên mảng: *numbers
  8. In giá trị của phần tử đầu tiên bằng con trỏ: *ptr

Đầu ra của bạn cần hiển thị kết quả theo định dạng sau:

Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10

Thử thách này minh họa rằng tên mảng hoạt động như một con trỏ hằng số đến phần tử đầu tiên, và numbers, &numbers[0] cùng ptr đều chứa cùng một địa chỉ bộ nhớ khi ptr được gán tên mảng.

Tự làm thử

#include <stdio.h>

int main() {
    // TODO: Viết code của bạn tại đây
    // 1. Khai báo và khởi tạo mảng (array) 'numbers' với {10, 20, 30, 40}
    // 2. Khai báo một con trỏ đến số nguyên (integer) tên là 'ptr'
    // 3. Gán tên mảng cho con trỏ
    // 4. In ra tất cả địa chỉ và giá trị (value) theo yêu cầu
    
    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