dereferencing chỉ có nghĩa là đọc giá trị bộ nhớ tại một địa chỉ nhất định. Vì vậy, khi bạn có một con trỏ đến một cái gì đó, để dereference con trỏ có nghĩa là để đọc hoặc ghi dữ liệu mà con trỏ trỏ đến.
Trong C, toán tử unsemble *
là toán tử dereferencing.Nếu x
là một con trỏ, thì *x
là những gì x
trỏ đến. Nhà điều hành độc lập &
là địa chỉ -of nhà điều hành. Nếu x
là bất cứ điều gì, thì &x
là địa chỉ mà tại đó x
được lưu trữ trong bộ nhớ. Các *
và &
nhà khai thác là ngược nhau: nếu x
là bất kỳ dữ liệu, và y
là bất kỳ con trỏ, sau đó những phương trình luôn đúng:
*(&x) == x
&(*y) == y
Một con trỏ null là một con trỏ không trỏ đến bất kỳ hợp lệ dữ liệu (nhưng nó không phải là con trỏ duy nhất). Tiêu chuẩn C nói rằng đó là hành vi không xác định để dereference một con trỏ null. Điều này có nghĩa rằng hoàn toàn bất cứ điều gì có thể xảy ra: chương trình có thể sụp đổ, nó có thể tiếp tục làm việc âm thầm, hoặc nó có thể xóa ổ cứng của bạn (mặc dù đó là khá khó xảy ra).
Trong hầu hết các triển khai, bạn sẽ nhận được "lỗi phân đoạn" hoặc "vi phạm truy cập" nếu bạn cố gắng làm như vậy, điều này hầu như luôn dẫn đến chương trình của bạn bị hệ điều hành chấm dứt. Dưới đây là một cách để một con trỏ null có thể được dereferenced:
int *x = NULL; // x is a null pointer
int y = *x; // CRASH: dereference x, trying to read it
*x = 0; // CRASH: dereference x, trying to write it
Và vâng, dereferencing một con trỏ null là khá nhiều giống hệt như một NullReferenceException
trong C# (hoặc một NullPointerException
trong Java), ngoại trừ các tiêu chuẩn langauge là nhiều hơn một chút hữu ích ở đây. Trong C#, dereferencing một tham chiếu null có hành vi được xác định rõ: nó luôn ném một NullReferenceException
. Không có cách nào mà chương trình của bạn có thể tiếp tục làm việc âm thầm hoặc xóa ổ đĩa cứng của bạn như trong C (trừ khi có lỗi trong thời gian chạy ngôn ngữ, nhưng một lần nữa điều đó cũng không khả thi).
Nguồn
2010-10-24 16:17:23
Hãy nhớ rằng làm như vậy dẫn đến hành vi không xác định. Bạn không nhận được ngoại lệ hoặc bất cứ điều gì, trong C hoặc C++. – GManNickG
Bạn có thể muốn đặt xuống một số mã ví dụ. Dường như mọi người (kể cả tôi) không hiểu những gì bạn đang cố hỏi. –
Không cần mã (không có bất kỳ) - Đây là một vấn đề khái niệm tôi đang gặp phải, cố gắng để có được đầu của tôi xung quanh thuật ngữ "dereferencing" và tại sao tôi nên quan tâm đến nó. – Ash