Giao diện
Pointer & Reference Mastery
🎯 Mục tiêu
🎯 Sau bài thực hành này, bạn sẽ:
- Thành thạo pointer arithmetic và pointer-to-pointer
- Phân biệt pointer vs reference trong mọi ngữ cảnh
- Quản lý dynamic arrays an toàn với new/delete
- Áp dụng nullptr checks để tránh undefined behavior
Mô tả bài tập
Con trỏ là nền tảng C++. Hiểu sâu pointer giúp bạn debug memory issues và sẵn sàng cho smart pointers.
Yêu cầu
Bài 1: Pointer Arithmetic
Viết hàm tìm phần tử lớn nhất chỉ dùng pointer arithmetic (không dùng arr[i]).
cpp
#include <iostream>
int* findMax(int* begin, int* end) {
// TODO: Duyệt bằng pointer, trả về pointer đến phần tử lớn nhất
}
int main() {
int arr[] = {3, 7, 2, 9, 5, 1, 8};
int* maxPtr = findMax(arr, arr + 7);
if (maxPtr)
std::cout << "Max: " << *maxPtr << " at index " << (maxPtr - arr) << std::endl;
return 0;
}Bài 2: Pointer vs Reference — Swap
Hoàn thiện hai hàm swap — một dùng pointer, một dùng reference.
cpp
void swapPtr(int* a, int* b) { /* TODO */ }
void swapRef(int& a, int& b) { /* TODO */ }
int main() {
int x = 10, y = 20;
swapPtr(&x, &y);
std::cout << x << ", " << y << std::endl; // 20, 10
swapRef(x, y);
std::cout << x << ", " << y << std::endl; // 10, 20
}Bài 3: Dynamic Array — SafeArray Class
Viết class SafeArray với bounds checking và proper cleanup.
cpp
class SafeArray {
int* data;
size_t length;
public:
explicit SafeArray(size_t size); // cấp phát, khởi tạo = 0
~SafeArray(); // giải phóng bộ nhớ
int& at(size_t index); // bounds checking, throw out_of_range
size_t size() const;
};Gợi ý
Gợi ý Bài 1
Dùng int* current = begin; ++current để duyệt. So sánh *current > *maxPtr.
Gợi ý Bài 3
Constructor: data = new int[size]() — dấu () khởi tạo zero. Destructor: delete[] data;.
Lời giải tham khảo
Xem lời giải
cpp
int* findMax(int* begin, int* end) {
if (begin == end) return nullptr;
int* maxPtr = begin;
for (int* cur = begin + 1; cur != end; ++cur)
if (*cur > *maxPtr) maxPtr = cur;
return maxPtr;
}
void swapPtr(int* a, int* b) { int t = *a; *a = *b; *b = t; }
void swapRef(int& a, int& b) { int t = a; a = b; b = t; }
SafeArray::SafeArray(size_t size) : data(new int[size]()), length(size) {}
SafeArray::~SafeArray() { delete[] data; data = nullptr; }
int& SafeArray::at(size_t index) {
if (index >= length) throw std::out_of_range("Index out of range");
return data[index];
}
size_t SafeArray::size() const { return length; }