2012-12-25 37 views
5

Tự hỏi thông qua các mã nguồn LLVM tôi stumbled khi dòng mã nàyTham khảo và dereferencing trong cùng một hướng dẫn

MachineInstr *MI = &*I; 

Tôi kinda newb trong C++ và sự khác biệt giữa các tài liệu tham khảo và gợi ý là khá mơ hồ với tôi, và Tôi nghĩ rằng nó có một cái gì đó để làm về sự khác biệt này, nhưng hoạt động này không có ý nghĩa với tôi. Có ai có lời giải thích cho việc đó không?

+0

Đó có phải là '& *' bạn đang thắc mắc không? – jalf

+0

@jalf: Liên quan đến tiêu đề "Tham chiếu và dereferencing trong cùng một hướng dẫn", tôi tin rằng tất cả mọi thứ trỏ đến có;) – Zeta

+0

@ jalf: Chính xác :) Tôi không thấy lý do nào để làm điều đó –

Trả lời

8

Loại I có lẽ là một số loại vòng lặp hoặc con trỏ thông minh có số operator*() được nạp chồng quá mức để mang lại số MachineInstr&. Nếu bạn muốn có được một con trỏ tích hợp với đối tượng được tham chiếu bởi I, bạn có thể tham chiếu đến đối tượng bằng cách sử dụng *I và sau đó bạn lấy địa chỉ của tham chiếu này, sử dụng &*I.

+0

'I' thực sự là một trình lặp. Điều này hoàn toàn có ý nghĩa :) –

+0

Nếu 'I' là * chỉ * một con trỏ, điều này không có ý nghĩa. Nhiều khả năng nó là một con trỏ thông minh (một lớp mà "cư xử" như một con trỏ). Đối với một con trỏ thô, '*' và '&' có hiệu quả hủy bỏ lẫn nhau. Nhưng đối với con trỏ thông minh, đây là một cách để có được một con trỏ * raw * đến đối tượng được trỏ tới – jalf

+0

Xin lỗi, tôi có nghĩa là trình vòng lặp và tôi đã viết con trỏ. Lỗi của tôi –

2

C++ cho phép quá tải toán tử dereference, vì vậy nó đang sử dụng phương thức quá tải trên đối tượng, và sau đó nó lấy địa chỉ của kết quả và đặt nó vào con trỏ.

+2

Lưu ý rằng toán tử địa chỉ (tiền tố '&') cũng có thể được định nghĩa lại, nhưng mã sane không làm điều đó, vì vậy người ta thường có thể bỏ qua nó. – delnan

+0

@delnan: tình cờ, ngay cả trong trường hợp đó bạn vẫn có thể nhận được địa chỉ với [thủ thuật lạ] (http://stackoverflow.com/q/6494591/214671). –

+0

@delnan sẽ rất thú vị: P –

2

Tuyên bố này:

MachineInstr *MI = &*I; 

dereferences I với *, và nhận được địa chỉ của kết quả của nó với & sau đó gán nó vào MI mà là một con trỏ đến MachineInstr. Có vẻ như I là một trình lặp, do đó, *I là giá trị được lưu trữ trong vùng chứa vì trình vòng lặp xác định toán tử * để trả lại mục tại điểm lặp. Vùng chứa (ví dụ: danh sách) phải chứa một số MachineInstr. Đây có thể là std::list<MachineInstr>.

Các vấn đề liên quan