Có một số khó khăn với con trỏ:
- Aliasing Khả năng thay đổi giá trị của một đối tượng bằng cách sử dụng các tên / biến khác nhau.
- Không cục bộ Khả năng thay đổi giá trị đối tượng trong ngữ cảnh khác với bối cảnh được khai báo (điều này cũng xảy ra với các đối số được truyền bằng tham chiếu).
- Sự không phù hợp trọn đời Thời gian tồn tại của một con trỏ có thể khác với thời gian tồn tại của đối tượng mà nó trỏ đến và điều đó có thể dẫn đến các tham chiếu không hợp lệ (SEGFAULTS) hoặc rác.
- Số học con trỏ . Một số ngôn ngữ lập trình cho phép thao tác con trỏ dưới dạng số nguyên và điều đó có nghĩa là con trỏ có thể trỏ đến bất kỳ đâu (kể cả những nơi không mong đợi nhất khi có lỗi). Để sử dụng số học con trỏ một cách chính xác, một lập trình viên phải nhận thức được kích thước bộ nhớ của các đối tượng được trỏ đến, và đó là điều cần suy nghĩ nhiều hơn.
- Kiểu phôi Khả năng truyền con trỏ từ loại này sang loại khác cho phép ghi đè lên bộ nhớ của một đối tượng khác với mục đích.
Đó là lý do tại sao một lập trình viên phải suy nghĩ thấu đáo hơn khi sử dụng con trỏ (tôi không biết về hai mức độ trừu tượng ). Đây là một ví dụ về những sai lầm điển hình được thực hiện bởi một người mới:
Pair* make_pair(int a, int b)
{
Pair p;
p.a = a;
p.b = b;
return &p;
}
Lưu ý rằng mã như trên là hoàn toàn hợp lý trong các ngôn ngữ không có khái niệm về con trỏ mà chỉ là một trong các tên (tham chiếu), đối tượng và giá trị, như ngôn ngữ lập trình chức năng và ngôn ngữ có bộ sưu tập rác (Java, Python) .
Khó khăn với các hàm đệ quy xảy ra khi những người không có đủ nền tảng toán học (trong đó đệ quy là kiến thức phổ biến và bắt buộc) cố gắng tiếp cận họ nghĩ rằng hàm này sẽ hoạt động khác nhau tùy thuộc vào số lần nó được gọi trước đó . Vấn đề đó trở nên trầm trọng hơn vì các hàm đệ quy thực sự có thể được tạo ra theo cách mà bạn phải nghĩ theo cách đó để hiểu chúng.
Hãy nghĩ về các hàm đệ quy với các con trỏ được truyền xung quanh, giống như trong quá trình thực hiện thủ tục của Cây Đỏ-Đen trong đó cấu trúc dữ liệu được sửa đổi tại chỗ; đó là một cái gì đó khó khăn hơn để suy nghĩ về một đối tác chức năng .
Nó không được đề cập trong câu hỏi, nhưng vấn đề quan trọng khác mà người mới gặp khó khăn là đồng thời .
Như những người khác đã đề cập, có một vấn đề bổ sung, phi khái niệm với một số cấu trúc ngôn ngữ lập trình: đó là ngay cả khi chúng ta hiểu, những lỗi đơn giản và trung thực với các cấu trúc đó có thể cực kỳ khó gỡ lỗi.