2013-01-08 22 views
44

Tôi đọc những thứ khác nhau trên internet và bị lẫn lộn, bởi vì mọi trang web đều nói những điều khác nhau.ý nghĩa của "tham chiếu" và "dereferencing"

Nói về C.

Tôi đọc về * hành tham khảo và & hành dereferencing; hoặc tham chiếu đó có nghĩa là làm cho một con trỏ trỏ đến một biến và dereferencing đang truy cập vào giá trị của biến mà con trỏ trỏ đến. Vì vậy, tôi đã bối rối.

Tôi có thể nhận được giải thích đơn giản nhưng kỹ lưỡng về "tham chiếu và tham chiếu" không?

+2

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=ptrs –

+6

Lưu ý rằng tên chính thức là địa chỉ ('&') và toán tử gián tiếp ('*') . –

+3

Bạn có các toán tử trộn lẫn. * là toán tử hủy đăng ký. – cheznead

Trả lời

55

Tham chiếu nghĩa là lấy địa chỉ của biến hiện tại (sử dụng &) để đặt biến con trỏ. Để có giá trị, một con trỏ phải được thiết lập để địa chỉ của một biến kiểu tương tự như con trỏ, mà không có dấu hoa thị:

int c1; 
int* p1; 
c1 = 5; 
p1 = &c1; 
//p1 references c1 

dereferencing một con trỏ có nghĩa là sử dụng toán tử * (dấu hoa thị ký tự) để truy cập giá trị được lưu trữ tại một con trỏ: LƯU Ý: Giá trị được lưu trữ tại địa chỉ của con trỏ phải là giá trị CỦA LOẠI CÙNG là loại biến con trỏ "điểm", nhưng có không đảm bảo đây là trường hợp trừ khi con trỏ được đặt chính xác. Loại biến mà con trỏ trỏ đến là loại ít dấu hoa thị ngoài cùng.

int n1; 
n1 = (*p1); 

không hợp lệ dereferencing có thể hoặc không có thể gây ra tai nạn:

  • Bất kỳ dereferencing của bất kỳ con trỏ chưa được khởi tạo có thể gây ra một vụ tai nạn
  • dereferencing với một kiểu dàn diễn viên không hợp lệ sẽ có khả năng gây ra một vụ tai nạn.
  • dereferencing một con trỏ đến một biến mà được cấp phát động và sau đó đã được de-phân bổ có thể gây ra một vụ tai nạn
  • dereferencing một con trỏ đến một biến mà kể từ đó đã đi ra khỏi phạm vi cũng có thể gây ra một vụ tai nạn.

không hợp lệ tham khảo có nhiều khả năng gây ra lỗi biên dịch hơn tai nạn, nhưng nó không phải là một ý tưởng tốt để dựa vào trình biên dịch cho việc này.

Tài liệu tham khảo:

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

& is the reference operator and can be read as “address of”. 
* is the dereference operator and can be read as “value pointed by”. 

http://www.cplusplus.com/doc/tutorial/pointers/

& is the reference operator  
* is the dereference operator 

http://en.wikipedia.org/wiki/Dereference_operator

The dereference operator * is also called the indirection operator. 
13

Tôi luôn nghe họ dùng trong ý nghĩa ngược lại:

  • & là các nhà điều hành tài liệu tham khảo - nó mang lại cho bạn một tài liệu tham khảo (con trỏ) đối với một số đối tượng

  • * là toán tử tham chiếu - phải mất một tham chiếu (con trỏ) và cung cấp cho bạn trở lại đối tượng được gọi;

8

Để bắt đầu, bạn có chúng ngược lại: & là tham chiếu và * là tham chiếu.

Tham khảo một phương tiện biến truy cập vào địa chỉ bộ nhớ của biến:

int i = 5; 
int * p; 
p = &i; //&i returns the memory address of the variable i. 

dereferencing một phương tiện biến truy cập vào biến được lưu trữ tại một địa chỉ bộ nhớ:

int i = 5; 
int * p; 
p = &i; 
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i. 
//i is now 7 
+2

Tiếp tục, địa chỉ bộ nhớ của biến i không phải là 5, 5 là giá trị của i. Phải không? Địa chỉ bộ nhớ phải là một cái gì đó giống như .. 0XA234948 ... mà chúng ta không cần phải biết. – Nayana

+0

@dockbudu Chính xác. Giá trị của i là 5, địa chỉ bộ nhớ sẽ là một số giá trị mà chúng ta không có quyền kiểm soát (thường được biểu diễn trong hexidecimal). – ApproachingDarknessFish

4

tìm ra lời giải thích dưới đây:

int main() 
{ 
    int a = 10;// say address of 'a' is 2000; 
    int *p = &a; //it means 'p' is pointing[referencing] to 'a'. i.e p->2000 
    int c = *p; //*p means dereferncing. it will give the content of the address pointed by 'p'. in this case 'p' is pointing to 2000[address of 'a' variable], content of 2000 is 10. so *p will give 10. 
} 

kết luận:

  1. & [toán tử địa chỉ] được sử dụng để tham chiếu.
  2. * [toán tử gắn dấu sao] được sử dụng để không tham chiếu.