(void *)和&之间的差异

时间:2013-02-11 14:24:03

标签: c++

您好我一直在使用新的位置并使用它来创建对象。 请考虑以下事项:

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之间有什么区别,为什么每一个都给我一个不同的地址。

4 个答案:

答案 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指针)。另一方面,&bufferbuffer 本身的记忆位置。

图表可能有所帮助; 这是正在发生的事情的象征,并不代表实际内存布局的样子!

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"