Skip to content

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