[英]difference between (void*) and &
嗨,我一直在練習new的放置並使用它來創建對象。 考慮以下:
class PNewTesting
{
private:
string words;
public:
PNewTesting(const string & w = "Placement new testing");
};
PNewTesting::PNewTesting(const string & w)
{
words = w;
cout << words << " constructed" << endl;
}
int main()
{
char * buffer = new char[BUF];
PNewTesting *p1,*p2;
p1 = new (buffer)PNewTesting;
p2 = new PNewTesting("Placing object in heap");
cout << "Memory addresses: " << endl;
cout << "buffer: " << (void *)buffer << endl;
cout << "object placed in buffer: " << p1 << endl;
cout << "object in heap: " << p2 << endl;
}
部分讓我感到困惑,是當我寫cout << "buffer: " << &buffer << endl;
,這會給我一個與編寫cout << "buffer: " << (void *)buffer << endl;
時不同的地址cout << "buffer: " << (void *)buffer << endl;
問題是&buffer
和(void*)buffer
有什么區別,為什么它們每個都給我一個不同的地址。
表達式&buffer
將為您提供buffer
的地址,該地址位於堆棧中的某個位置。
expresson (void *)buffer
將為您提供緩沖區中包含的地址,作為一個空指針(在這種情況下,這意味着cout
會將值打印為代表該指針的十六進制數,而不是嘗試進行打印)該值作為字符串,這將是代碼通常使用char *
。
其中一個顯示變量的地址,另一個顯示變量的值。 考慮這些:
int i = 7;
std::cout << &i << "\n";
std::cout << i << "\n";
前者顯示名為i
的變量的地址(可能是較大的偶數)。 另一個顯示其值(7)。
類似地:
char *buffer;
std::cout << &buffer << "\n";
std::cout << (void*)buffer << "\n";
前者顯示buffer
的地址。 后者顯示其轉換值。
區別很簡單。 buffer
是一個指向字符的指針,因此(void*)buffer
是分配的字符數組在內存中的位置(作為void
指針)。 另一方面, &buffer
是buffer
本身在內存中的位置。
圖表可能會有所幫助; 這象征着正在發生的事情,並不代表實際的內存布局將是什么樣子!
Memory
AB AB AB AB 00 00 00 08 <-- buffer = 00 00 00 08; the characters are stored starting at 0x08
^
|--------- &buffer is the memory location of buffer, and is 0x04
30 31 32 32 AB AB AB AB
^
|-------- char array starts at 0x08, and contains the string "1234"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.