[英]Is the address of a reference to a dereferenced pointer the same as the address of the pointer?
在C ++中,對解除引用指針的引用的地址是否保證與指針的地址相同?
或者,用代碼編寫,以下斷言保證始終成立?
SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);
是的,這是正確的,永遠是真的。
引用只不過是它所指的類型的別名。 它沒有單獨的存在,它總是與它所指的那個相關聯。
是的,當然提供someAddress
不是空指針,否則不允許解除引用。 在這種情況下,行為是未定義的,盡管您的實現可能表現得好像它們相同,尤其是在優化級別較低的情況下。
如果你想要精確,那么&ref
實際上不是“引用的地址”,它是“引用的參考地址”。 由於ref
結合於*ptr
,這意味着的referand ref
和的referand(或指針對象如果您願意) ptr
是同一個對象,並且因此這兩個地址&ref
和ptr
是相等的。
正如Bo指出的那樣,你要比較&ref
的是“指針的值”,或“存儲在指針中的地址”,而不是“指針的地址”。
是的,如果引用本身有一個地址,它由實現管理,不能從代碼訪問。 無論如何,它只是同一個對象的不同名稱。
是的,你的理解是正確的。 對於99.(9)%的代碼,您的代碼將是正確的。 對於觀眾中的仆人(我自己),這種說法並不總是如此:
SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);
考慮這個程序:
#include <cassert>
struct SomeType { void* operator&() { return 0; } };
int main() {
SomeType *ptr = new SomeType;
SomeType &ref = *ptr;
assert(&ref == ptr);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.