为什么 void 指针不同于引用值?

Why is void pointer different from reference value?

class Class1
{
    int data;
    int *dataPtr;
}

int main()
{
     Class1 object;
     Class1 *objectPtr = &object;
     object.data = 1100;
     object.dataPtr = &(object.data)

     std::cout << object.dataPtr << std::endl;  //0x22aaa4
     std::cout << (void *) (object.data) << std::endl;  //0x1b198
     std::cout << (void *) &(object.data) << std::endl;  //0x22aaa4

为什么 (void *) (object.data)object.dataPtr 不同?

如果我想使用 memcpy 将值从其他地方复制到 object.data,我应该使用哪个内存位置?

memcpy( (void *) (object.data), source, size);

memcpy( (void *) &(object.data), source, size);

谢谢!

因为(void *) (object.data)data的数值重新解释为一个指针,所以它可以有任何值;对它做任何事情都会导致未定义的行为。 (如评论中所述,如果实现定义的转换仅使用数值 1100 作为地址并且未定义的行为不会引起任何意外,人们会期望它是 0x44c。)

object.data的地址是&object.data

如果您使用更安全的转换,或者在 memcpy 的情况下使用隐式转换,那么编译器将阻止这种不可靠的转换:

static_cast<void *>(object.data)    // ERROR: int->pointer conversion
static_cast<void *>(&object.data)   // OK: pointer conversion

memcpy(object.data, source, size);  // ERROR: int where pointer expected
memcpy(&object.data, source, size); // OK: pointer converts to void*

一般来说,避免 C 风格的转换。和 memcpy。和指点。

这个问题是假的。如果不首先修复语法错误,代码甚至无法编译。

一旦你让它编译,它会产生预期的输出,而不是 OP 所说的。

此处:http://ideone.com/qXWkGF

Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888