Quay trở lại những ngày đó, các nhà phát triển đã làm việc gần gũi hơn với kim loại. C về cơ bản là một sự thay thế cấp cao hơn cho lắp ráp, gần với phần cứng như bạn có thể nhận được, do đó, điều tự nhiên là bạn cần con trỏ để có hiệu quả trong việc giải quyết các vấn đề mã hóa. Tuy nhiên, con trỏ là công cụ sắc bén, có thể gây ra thiệt hại lớn nếu sử dụng bất cẩn. Ngoài ra, việc sử dụng trực tiếp con trỏ mở ra khả năng cho nhiều vấn đề bảo mật, điều mà trước đây không phải là vấn đề (vào năm 1970, internet bao gồm khoảng vài chục máy trên một vài trường đại học và thậm chí còn không được gọi như vậy ...), nhưng ngày càng trở nên quan trọng hơn. Vì vậy, ngày nay các ngôn ngữ cấp cao hơn được thiết kế có ý thức để tránh các con trỏ bộ nhớ thô.
Nói rằng "những điều nâng cao được thực hiện trong VB.Net hoặc Java là không thể có trong C" cho thấy quan điểm rất hạn chế, để nói rằng ít nhất :-)
Trước hết, tất cả các ngôn ngữ này (thậm chí là lắp ráp) đều hoàn chỉnh, vì vậy về mặt lý thuyết, bất cứ điều gì có thể có trong một ngôn ngữ, đều có thể thực hiện được. Chỉ cần nghĩ về những gì xảy ra khi một đoạn mã VB.Net hoặc Java được biên dịch và thực thi: cuối cùng, nó được dịch thành (hoặc ánh xạ tới) mã máy, bởi vì đó là điều duy nhất mà máy hiểu được. Trong các ngôn ngữ được biên dịch như C và C ++, bạn thực sự có thể lấy toàn bộ mã máy tương đương với mã nguồn cấp cao hơn ban đầu, dưới dạng một hoặc nhiều tệp / thư viện thực thi. Trong các ngôn ngữ dựa trên VM, sẽ khó khăn hơn (và thậm chí là không thể) để có được toàn bộ biểu diễn mã máy tương đương của chương trình của bạn, nhưng cuối cùng nó vẫn ở đâu đó, trong phần sâu của hệ thống thời gian chạy và JIT.
Bây giờ, tất nhiên, đó là một câu hỏi hoàn toàn khác nhau cho dù một số giải pháp là khả thi trong một ngôn ngữ cụ thể. Không có nhà phát triển hợp lý nào có thể bắt đầu viết một ứng dụng web trong hội đồng :-) Nhưng thật hữu ích khi biết rằng hầu hết hoặc tất cả các ngôn ngữ cấp cao hơn đó đều được xây dựng dựa trên số lượng lớn thời gian chạy và mã thư viện lớp, một khối lớn được thực hiện bằng ngôn ngữ cấp thấp hơn, điển hình là C.
Vì vậy, để có được câu hỏi,
Bạn có nghĩ rằng kiến thức về con trỏ cho những người trẻ tuổi [...] là quan trọng không?
Khái niệm đằng sau con trỏ là gián tiếp . Đây là một khái niệm rất quan trọng và IMHO mỗi lập trình viên giỏi nên nắm bắt nó ở một mức độ nhất định. Ngay cả khi ai đó chỉ làm việc với các ngôn ngữ cấp cao hơn, việc xác định và tham chiếu vẫn rất quan trọng. Không hiểu điều này có nghĩa là không thể sử dụng cả một nhóm các công cụ rất mạnh, hạn chế nghiêm trọng khả năng giải quyết vấn đề của một người trong thời gian dài.
Vì vậy, câu trả lời của tôi là có, nếu bạn muốn trở thành một lập trình viên thực sự giỏi, bạn cũng phải hiểu con trỏ (cũng như đệ quy - đây là khối vấp ngã điển hình khác cho các nhà phát triển vừa chớm nở). Bạn có thể không cần bắt đầu với nó - Tôi không nghĩ C là tối ưu như ngôn ngữ đầu tiên hiện nay. Nhưng tại một số điểm, người ta nên làm quen với sự gián tiếp. Không có nó, chúng ta không bao giờ có thể hiểu làm thế nào các công cụ, thư viện và khung mà chúng ta đang sử dụng thực sự hoạt động. Và một thợ thủ công không hiểu cách thức hoạt động của các công cụ của mình là rất hạn chế. Đủ công bằng, người ta cũng có thể nắm bắt được nó trong các ngôn ngữ lập trình cấp cao hơn. Một bài kiểm tra quỳ tốt là thực hiện chính xác một danh sách liên kết đôi - nếu bạn có thể làm điều đó bằng ngôn ngữ yêu thích của mình, bạn có thể khẳng định rằng bạn hiểu rõ về sự gián tiếp.
Nhưng nếu không phải vì bất cứ điều gì khác, chúng ta nên làm điều đó để học cách tôn trọng các lập trình viên cũ, những người đã cố gắng xây dựng những thứ không thể tin được bằng cách sử dụng các công cụ đơn giản lố bịch mà họ có (so với những gì chúng ta có bây giờ). Tất cả chúng ta đều đứng trên vai những người khổng lồ, và thật tốt khi chúng ta thừa nhận điều này, thay vì giả vờ rằng chúng ta là những người khổng lồ.