Một số loại gián tiếp là cần thiết cho các chương trình phức tạp (ví dụ cấu trúc dữ liệu đệ quy hoặc có kích thước thay đổi). Tuy nhiên, không cần thiết phải thực hiện điều hướng này thông qua con trỏ.
Phần lớn các ngôn ngữ lập trình cấp cao (không phải hội) là khá an toàn bộ nhớ và không cho phép truy cập con trỏ không bị hạn chế. Gia đình C là người kỳ quặc ở đây.
C phát triển ra khỏi B là một sự trừu tượng rất mỏng so với lắp ráp thô. B có một loại duy nhất: từ. Từ này có thể được sử dụng như một số nguyên hoặc như một con trỏ. Hai cái đó tương đương nhau khi toàn bộ bộ nhớ được xem như một mảng liền kề. C giữ cách tiếp cận khá linh hoạt này và tiếp tục hỗ trợ số học con trỏ vốn không an toàn. Toàn bộ hệ thống loại C là một suy nghĩ lại. Tính linh hoạt này đối với truy cập bộ nhớ khiến C rất phù hợp cho mục đích chính của nó: tạo mẫu cho hệ điều hành Unix. Tất nhiên Unix và C hóa ra khá phổ biến, do đó C cũng được sử dụng trong các ứng dụng mà cách tiếp cận bộ nhớ cấp thấp này không thực sự cần thiết.
Nếu chúng ta xem xét các ngôn ngữ lập trình xuất hiện trước C (ví dụ Fortran, phương ngữ Algol bao gồm Pascal, Cobol, Lisp, thì) một số ngôn ngữ hỗ trợ con trỏ giống C. Đáng chú ý, khái niệm con trỏ null được phát minh cho Algol W vào năm 1965. Nhưng không có ngôn ngữ nào cố gắng trở thành ngôn ngữ hệ thống trừu tượng thấp hiệu quả giống như C: Fortran có nghĩa là để tính toán khoa học, Algol đã phát triển một số khái niệm khá tiên tiến, Lisp là nhiều hơn một dự án nghiên cứu hơn là một ngôn ngữ cấp ngành và Cobol tập trung vào các ứng dụng kinh doanh.
Thu gom rác tồn tại từ cuối những năm 50, tức là trước C (đầu thập niên 70). GC yêu cầu an toàn bộ nhớ để hoạt động đúng. Ngôn ngữ trước và sau C sử dụng GC như một tính năng bình thường. Tất nhiên, điều đó làm cho một ngôn ngữ phức tạp hơn nhiều và có thể chậm hơn, đặc biệt đáng chú ý trong thời gian của các máy tính lớn. Các ngôn ngữ GC có xu hướng định hướng nghiên cứu (ví dụ Lisp, Simula, ML) và / hoặc yêu cầu các máy trạm mạnh mẽ (ví dụ Smalltalk).
Với các máy tính nhỏ hơn, mạnh hơn, nói chung và các ngôn ngữ GC nói riêng đã trở nên phổ biến hơn. Đối với các ứng dụng không theo thời gian thực (và đôi khi ngay cả sau đó), giờ đây, phương pháp được ưa thích. Nhưng thuật toán GC cũng là chủ đề của nghiên cứu mạnh mẽ. Thay vào đó, an toàn bộ nhớ tốt hơn mà không cần GC cũng đã được phát triển hơn nữa, đặc biệt là trong ba thập kỷ qua: những đổi mới đáng chú ý là RAII và con trỏ thông minh trong hệ thống kiểm tra vay / hệ thống suốt đời của C ++ và Rust.
Java đã không đổi mới bằng cách trở thành ngôn ngữ lập trình an toàn cho bộ nhớ: về cơ bản, nó đã sử dụng ngữ nghĩa của ngôn ngữ Smalltalk an toàn cho bộ nhớ và kết hợp chúng với cú pháp và gõ tĩnh của C ++. Sau đó, nó đã được bán trên thị trường như một C / C ++ tốt hơn, đơn giản hơn. Nhưng bề ngoài chỉ là một hậu duệ C ++. Việc thiếu con trỏ của Java bị nợ nhiều hơn đối với mô hình đối tượng Smalltalk hơn là từ chối mô hình dữ liệu C ++.
Vì vậy, không nên hiểu các ngôn ngữ hiện đại của Java như Java, Ruby và C # là khắc phục các vấn đề của con trỏ thô như trong C, mà nên được xem là vẽ từ nhiều truyền thống - bao gồm C, mà còn từ các ngôn ngữ an toàn hơn như Smalltalk, Simula, hoặc Lisp.