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.
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:
- Khai báo một mảng số nguyên tên là
numberscó 4 phần tử và khởi tạo mảng bằng các giá trị {10, 20, 30, 40} - Khai báo một con trỏ đến số nguyên tên là
ptr - Gán tên mảng
numberscho con trỏptr - In địa chỉ được lưu trong
numbersbằngprintfvới bộ chỉ định định dạng%p - In địa chỉ của phần tử đầu tiên
&numbers[0]bằngprintfvới bộ chỉ định định dạng%p - In địa chỉ được lưu trong
ptrbằngprintfvới bộ chỉ định định dạng%p - In giá trị của phần tử đầu tiên bằng tên mảng:
*numbers - 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: 10Thử 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;
}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