Con trỏ và mảng
Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 5 trên 56.
Mảng và con trỏ có mối liên hệ đặc biệt trong C++. Khi khai báo một mảng, tên mảng thực chất hoạt động như một con trỏ trỏ đến phần tử đầu tiên của mảng đó. Mối liên hệ này cho phép bạn dùng con trỏ để thao tác với mảng theo nhiều cách mạnh mẽ.
Xét khai báo mảng sau:
int numbers[5] = {10, 20, 30, 40, 50};
int* ptr = numbers; // ptr hiện trỏ đến numbers[0]Ở đây, numbers tương đương với &numbers[0], cả hai đều cho bạn địa chỉ của phần tử đầu tiên. Con trỏ ptr hiện trỏ đến cùng một vị trí.
Khi đã có con trỏ đến một mảng, bạn có thể dùng phép toán con trỏ để di chuyển qua các phần tử. Cộng 1 vào con trỏ sẽ đưa nó đến phần tử tiếp theo cùng kiểu:
ptr++; // Giờ trỏ đến numbers[1]
ptr = ptr + 2; // Giờ trỏ đến numbers[3]Bạn có thể giải tham chiếu con trỏ ở bất kỳ vị trí nào để truy cập giá trị: *ptr cho bạn giá trị tại vị trí hiện tại, còn *(ptr + 1) cho bạn giá trị của phần tử tiếp theo.
Mối quan hệ giữa con trỏ (pointer) và mảng (array) này cho phép bạn duyệt mảng bằng con trỏ thay vì dùng vòng lặp dựa trên chỉ số (index-based loop) truyền thống, mang đến một cách khác để duyệt mảng.
Thử thách
DễTạo một chương trình dùng con trỏ để duyệt qua mảng và in ra từng phần tử, qua đó thể hiện mối quan hệ giữa con trỏ và mảng.
Bạn được cung cấp mảng sau:
int values[6] = {15, 23, 8, 42, 17, 31};Chương trình của bạn cần:
- Tạo một con trỏ tên là
ptrtrỏ đến phần tử đầu tiên của mảngvalues - Dùng phép toán con trỏ để duyệt qua tất cả 6 phần tử của mảng
- In ra từng phần tử bằng cách giải tham chiếu con trỏ tại mỗi vị trí
- Dùng phép toán con trỏ để di chuyển con trỏ đến phần tử tiếp theo (tăng con trỏ)
In mỗi phần tử trên một dòng riêng theo định dạng sau:
Element: [value]Đầu ra cần hiển thị đủ 6 phần tử theo thứ tự xuất hiện trong mảng, truy cập từng phần tử bằng cách giải tham chiếu con trỏ thay vì dùng chỉ số mảng.
Tự làm thử
#include <iostream>
using namespace std;
int main() {
// Mảng cho trước
int values[6] = {15, 23, 8, 42, 17, 31};
// TODO: Tạo con trỏ tên 'ptr' trỏ đến phần tử đầu tiên của mảng
// TODO: Dùng vòng lặp để duyệt cả 6 phần tử bằng phép toán con trỏ
// TODO: In ra từng phần tử bằng cách giải tham chiếu con trỏ
// TODO: Di chuyển con trỏ đến phần tử tiếp theo bằng phép toán con trỏ
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 chương trình
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online