Pointer và bộ nhớ

Pointer arithmetic

Cộng một vào typed pointer sẽ tiến một phần tử hoàn chỉnh, không phải một byte.

Pointer arithmetic là gì?

Cộng một vào typed pointer sẽ tiến một phần tử hoàn chỉnh, không phải một byte.

Duyệt vùng nhớ liên tục bằng pointer và iterator.

Điểm quan trọng

  • Pointer chỉ được trỏ tới object còn sống, đúng type hoặc null.
  • Mỗi vùng nhớ sở hữu chỉ được giải phóng đúng một lần.
  • Thể hiện ownership và const rõ ràng trong API.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>

int main(void) {
    int values[] = {10, 20, 30, 40};
    int sum = 0;
    for (int *p = values; p < values + 4; ++p) sum += *p;
    printf("sum=%d distance=%td\n", sum, (values + 4) - values);
    return 0;
}
Output dự kiến
sum=100 distance=4
C++
Chạy code →
main.cpp
#include <iostream>
#include <vector>

int main() {
    std::vector values{10, 20, 30, 40};
    int sum = 0;
    for (auto it = values.begin(); it != values.end(); ++it) sum += *it;
    std::cout << "sum=" << sum << " distance="
              << std::distance(values.begin(), values.end()) << '\n';
}
Output dự kiến
sum=100 distance=4

So sánh C và C++

Pointer arithmetic chỉ hợp lệ trong cùng mảng hoặc one-past-end; iterator C++ diễn đạt traversal tương tự cho nhiều container.

C

Ownership và cleanup là quy ước do lập trình viên tự bảo đảm.

C++

Container và RAII gắn ownership cùng cleanup vào lifetime của object.

Bài tập mở rộng

Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.

  • Test null và trường hợp cấp phát thất bại.
  • Chạy AddressSanitizer và UndefinedBehaviorSanitizer.
  • Ghi rõ pointer nào sở hữu và pointer nào chỉ quan sát.