( Vui lòng đọc đoạn này trước khi đọc bài viết.Tôi yêu cầu bất cứ ai quan tâm đến việc đọc bài đăng này nên cố gắng đọc nó một cách cẩn thận, và tất nhiên đừng phản đối nó cho đến khi bạn hiểu nó hoàn toàn, cảm ơn. )
Bây giờ nó là wiki cộng đồng, vì vậy nếu ai đó không đồng ý với bất kỳ khái niệm nào, vui lòng sửa đổi nó, với lời giải thích rõ ràng và chi tiết về những gì sai và tại sao, và nếu có thể, vui lòng trích dẫn nguồn hoặc cung cấp bằng chứng có thể được sao chép lại.
Câu trả lời
Dưới đây là một số lý do khác có thể là yếu tố cơ bản cho NULL == 0
- Thực tế là số 0 là sai, vì vậy người ta có thể làm trực tiếp
if(!my_ptr)
thay vì if(my_ptr==NULL)
.
- Thực tế là các số nguyên toàn cục chưa được khởi tạo được khởi tạo theo mặc định cho tất cả các số không và như vậy một con trỏ của tất cả các số không sẽ được coi là chưa được khởi tạo.
Ở đây tôi muốn nói một lời về các câu trả lời khác
Không phải vì đường tổng hợp
Nói rằng NULL bằng 0 vì theo cú pháp, không có ý nghĩa quá nhiều, nếu vậy tại sao không sử dụng chỉ số 0 của một mảng để giữ độ dài của nó?
Trên thực tế, C là ngôn ngữ gần giống với cách triển khai bên trong nhất, có hợp lý khi nói rằng C chọn số 0 chỉ vì đường cú pháp không? Họ muốn cung cấp từ khóa null (như nhiều ngôn ngữ khác) hơn là ánh xạ từ 0 đến NULL!
Như vậy cho đến ngày nay nó có thể chỉ là đường cú pháp, rõ ràng là ý định ban đầu của các nhà phát triển ngôn ngữ C không phải là đường cú pháp, như tôi sẽ trình bày thêm.
1) Đặc điểm kỹ thuật
Tuy nhiên, mặc dù đúng là đặc điểm kỹ thuật C nói từ hằng số 0 dưới dạng con trỏ null (phần 6.3.2.3), và cũng xác định NULL được thực thi được xác định (phần 7.19 trong đặc tả C11 và 7.17 trong đặc tả C99), Thực tế vẫn là trong cuốn sách "Ngôn ngữ lập trình C" được viết bởi những người phát minh ra C, điều sau đây được nêu trong phần 5.4:
C đảm bảo rằng số 0 không bao giờ là địa chỉ hợp lệ cho dữ liệu, vì vậy giá trị trả về bằng 0 có thể được sử dụng để báo hiệu một sự kiện bất thường, trong trường hợp này là không có khoảng trắng.
Con trỏ và số nguyên không thể hoán đổi cho nhau, Số không là ngoại lệ duy nhất: hằng số 0 có thể được gán cho một con trỏ và một con trỏ có thể được so sánh với hằng số 0. Hằng số ký hiệu NULL thường được sử dụng thay cho số 0, như một phép ghi nhớ để chỉ rõ hơn rằng đây là một giá trị đặc biệt cho một con trỏ. NULL được định nghĩa trong. Chúng tôi sẽ sử dụng NULL kể từ đó.
Như người ta có thể thấy (từ các từ "địa chỉ số không") ít nhất ý định ban đầu của các tác giả của C là địa chỉ số không, chứ không phải hằng số 0, hơn nữa từ đoạn trích này xuất hiện lý do tại sao đặc tả nói từ hằng số 0 có lẽ không phải để loại trừ một biểu thức có giá trị bằng 0, nhưng thay vào đó, bao gồm hằng số nguyên 0 để trở thành hằng số nguyên duy nhất được phép sử dụng trong ngữ cảnh con trỏ mà không cần ép kiểu.
2) Tóm tắt
Mặc dù đặc điểm kỹ thuật không nói rõ ràng rằng địa chỉ số 0 có thể được xử lý khác với hằng số 0, nhưng nó không nói rằng không, và thực tế là khi xử lý hằng số con trỏ null, nó không khẳng định nó được triển khai được định nghĩa như nó làm bởi NULL hằng số được định nghĩa , thay vào đó khẳng định nó bằng 0, cho thấy rằng có thể có sự khác biệt giữa hằng số 0 và địa chỉ số không.
(Tuy nhiên nếu đây là trường hợp, tôi chỉ tự hỏi tại sao NULL được định nghĩa bởi vì trong trường hợp này NULL cũng có thể là hằng số 0, vì trình biên dịch dù sao cũng phải chuyển đổi tất cả các hằng số 0 thành triển khai thực tế được định nghĩa NULL?)
Tuy nhiên, tôi không thấy điều này trong hành động thực tế và trong các nền tảng chung, địa chỉ không và hằng số không được xử lý giống nhau và đưa ra cùng một thông báo lỗi.
Hơn nữa, thực tế là các hệ điều hành ngày nay thực sự đang lưu trữ toàn bộ trang đầu tiên (phạm vi 0x0000 đến 0xFFFF), chỉ để ngăn truy cập vào địa chỉ 0 do con trỏ NULL của C, (xem http://en.wikipedia.org/wiki/ Zero_page , cũng như "Windows Via C / C ++ của Jeffrey Richter và Christophe Nasarre (được xuất bản bởi Microsoft Press)").
Vì vậy, tôi sẽ yêu cầu bất kỳ ai tuyên bố rằng thực sự đã thấy nó hoạt động, vui lòng chỉ định nền tảng và trình biên dịch, và mã chính xác mà anh ta đã thực sự làm, (mặc dù do định nghĩa mơ hồ trong đặc tả [như tôi đã trình bày] bất kỳ trình biên dịch nào và nền tảng được tự do làm bất cứ điều gì anh ta muốn).
Tuy nhiên, có vẻ như các tác giả của C đã không nghĩ đến điều này, và họ đang nói về "địa chỉ không", và "C đảm bảo rằng nó không bao giờ là một địa chỉ hợp lệ", cũng như "NULL chỉ là một ghi nhớ ", cho thấy rõ ràng rằng ý định ban đầu của nó không phải dành cho" đường cú pháp ".
Không phải do hệ điều hành
Cũng tuyên bố rằng hệ điều hành từ chối quyền truy cập vào địa chỉ 0, vì một số lý do:
1) Khi C được viết, không có hạn chế nào như vậy, như người ta có thể thấy trên wikipage này http://en.wikipedia.org/wiki/Zero_page .
2) Thực tế là các trình biên dịch C đã truy cập địa chỉ bộ nhớ bằng không.
Đây dường như là sự thật từ bài báo sau của BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Hai trình biên dịch khác nhau về chi tiết trong cách họ đối phó với điều này. Trong phần trước, phần bắt đầu được tìm thấy bằng cách đặt tên một hàm; về sau, giá trị bắt đầu chỉ đơn giản là 0. Điều này cho thấy rằng trình biên dịch đầu tiên được viết trước khi chúng ta có một máy có ánh xạ bộ nhớ, vì vậy nguồn gốc của chương trình không phải ở vị trí 0, trong khi vào thời điểm thứ hai, chúng tôi đã có PDP-11 cung cấp ánh xạ.
(Thực tế cho đến ngày hôm nay (như tôi đã trích dẫn các tài liệu tham khảo ở trên từ wikipedia và microsoft press), lý do hạn chế quyền truy cập vào địa chỉ số 0 là do con trỏ NULL của C! Vì vậy, cuối cùng thì mọi chuyện lại diễn ra theo chiều ngược lại!)
3) Hãy nhớ rằng C cũng được sử dụng để viết hệ điều hành, và thậm chí cả trình biên dịch C!
Trên thực tế, C được phát triển với mục đích viết hệ điều hành UNIX với nó, và như vậy có vẻ như không có lý do gì khiến chúng phải tự giới hạn mình từ địa chỉ 0.
(Phần cứng) Giải thích về cách Máy tính (Vật lý) Có thể Truy cập Địa chỉ Zero
Có một điểm khác tôi muốn giải thích ở đây, làm thế nào nó có thể tham chiếu đến địa chỉ số không?
Hãy nghĩ về nó trong một giây, các địa chỉ được bộ xử lý tìm nạp và sau đó được gửi dưới dạng điện áp trên bus bộ nhớ, sau đó được hệ thống bộ nhớ sử dụng để truy cập địa chỉ thực, nhưng địa chỉ bằng 0 sẽ không có nghĩa là không có điện áp , vậy phần cứng vật lý của hệ thống bộ nhớ truy cập địa chỉ số 0 như thế nào?
Câu trả lời dường như là, địa chỉ số 0 là địa chỉ mặc định, và nói cách khác, địa chỉ số 0 luôn được hệ thống bộ nhớ truy cập khi bus bộ nhớ hoàn toàn tắt, và như vậy bất kỳ yêu cầu nào để đọc hoặc ghi mà không chỉ định địa chỉ thực (mà là trường hợp có địa chỉ bằng không) là tự động truy cập địa chỉ bằng không.
if (p != 0)
đểif (p)
mà là một thành ngữ phổ biến trong C và C ++, mặc dù bạn sẽ phải thoát khỏi thói quen nếu bạn mất Java.