您好我一直在使用新的位置并使用它来创建对象。 请考虑以下事项:
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;
问题是&buffer
和(void*)buffer
之间有什么区别,为什么每一个都给我一个不同的地址。
答案 0 :(得分:3)
您的问题可以是 essentially reduced to :
#include<iostream>
int main()
{
int i = 10;
int *ptr = &i;
std::cout<<(void*)ptr<<"\n";
std::cout<<(void*)&i<<"\n";
std::cout<< &ptr<<"\n";
}
输出
0xbfa080b8
0xbfa080b8
0xbfa080bc
ptr
为您提供指针所指向的对象的地址,即&i
&ptr
给出指针本身存储位置的地址。
答案 1 :(得分:1)
表达式&buffer
将为您提供buffer
的地址,该地址位于您的堆栈中。
表达式(void *)buffer
将为您提供缓冲区中包含的地址,作为void指针(在这种情况下,这意味着cout
将打印值作为表示指针的十六进制数,而不是例如,尝试将值打印为字符串,这将是代码通常用char *
执行的操作。
答案 2 :(得分:1)
其中一个显示变量的地址,另一个显示变量的值。考虑这些:
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
的地址。后者显示其铸造价值。
答案 3 :(得分:1)
区别很简单。 buffer
是一个指向char的指针,因此(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"