2012-12-25 14 views
5

yılında dereferencing ve Bence bu farkla ilgili bir şey var, ama bu işlem bana hiç mantıklı gelmiyor. Bunu yapmak için herhangi bir açıklaması var mı?, başvuruda bulunma ve ben kod</p> <pre><code>MachineInstr *MI = &*I; </code></pre> <p>Ben biraz c newb ++ ve referansları ve işaretçiler arasındaki fark bana oldukça belirsiz bu hat tökezledi LLVM kaynak koduna göz merak Aynı talimat

+0

Bu merak ettiğiniz bir şey mi? – jalf

+0

@jalf: "Aynı komutta referanslama ve dizgeleme" başlığı ile ilgili olarak, her şeyin evet olduğuna işaret ettiğine inanıyorum;) – Zeta

+0

@jalf: Kesinlikle :) Bunu yapmak için herhangi bir neden göremiyorum –

cevap

8

I tipi, MachineInstr& ürününü vermek üzere aşırı yüklü olan operator*() yüklü bir tür yineleyici veya akıllı göstericidir. I tarafından başvurulan nesneye yerleşik bir işaretçi almak istiyorsanız, *I kullanarak nesneye bir başvuru alırsınız ve &*I kullanarak bu başvurunun adresini alırsınız.

+0

'Ben aslında bir yineleyici. Bu tamamen anlamlıdır :) –

+0

Eğer ben sadece bir işaretçi isek, bu mantıklı değil. Büyük ihtimalle akıllı bir işaretçi (bir işaretçi gibi davranan bir sınıf). Bir ham işaretçi için, '' 've' & 'birbirlerini etkin bir şekilde iptal eder. Ancak akıllı işaretçiler için bu, işaretli nesneye – jalf

+0

bir ham * işaretçisi almanın bir yoludur Üzgünüm, yineleyici ve işaretçi yazdım. Benim hatam –

2

C++, dereference operatörünün aşırı yüklenmesine izin verir, bu nedenle nesne üzerinde aşırı yüklenmiş yöntemi kullanır ve sonuçta sonucun adresini alır ve işaretçiye yerleştirir.

+2

Adres-işlecini not edin (öneki '&') yeniden tanımlanabilir, ancak aklı başında kodlar bunu yapmaz, dolayısıyla genellikle bunu göz ardı edebilir. – delnan

+0

@delnan: tesadüfen, bu durumda bile [garip hileler] ile adresi alabilirsiniz (http://stackoverflow.com/q/6494591/214671). –

+0

@delnan o kadar eğlenceli olurdu: P –

2

Bu ifade:

MachineInstr *MI = &*I; 

dereferences * ile I ve & ile sonucun adresini alır sonra MachineInstr bir göstericidir MI atar. I bir yineleyici gibi görünüyor, bu nedenle *I, iterators öğeyi yineleme noktasında döndürmek için * işlecini tanımladığından bir kapta depolanan değerdir. Kap (örneğin bir liste) bir MachineInstr içermelidir. Bu bir std::list<MachineInstr> olabilir.