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++
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;
}
sum=100 distance=4
C++
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';
}
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.