1

可能重复:
为什么数组的地址等于它在 C 中的值?

在这种情况下:

int x = 5;
unsigned char myArray[sizeof (int)];

这条线...

memcpy (&myArray , &x , sizeof (int));

...产生与以下相同的结果:

memcpy (myArray , &x , sizeof (int));

我对 C++ 非常陌生,但我的印象是数组只是指向其数据的指针。当 &myArray 的工作方式与 myArray 相同时,我感到很震惊。我原以为它会试图复制到指针的地址,这将是非常糟糕的!

4

3 回答 3

4

关于数组的两件事:

  • 数组“衰减”到其元素类型的指针。这就是第二个版本有效的原因。看到这个:数组名是指针吗?

  • 有一个“指向数组的指针”这样的东西。它们很少使用,但看起来像这样:


int a[5];
int (*b)[5] = &a; // pointer to an array of 5 ints

&数组上使用运算符时,会为您提供指向数组类型的指针,这就是以下内容不起作用的原因:

int* b = &a; // error

由于memcpy的参数是 a void*,它接受任何指针类型,两者都可以&myArray工作myArray。我会推荐使用它,myArray因为它更惯用。

于 2013-02-01T03:45:26.623 回答
1

您认为类型不同是正确的。&myArrayis a unsigned char(*)[](指向 unsigned char 数组的指针) 并且myArray(当作为参数传递给函数时) 变为 type unsigned char*(指向 unsigned char 的指针)。但是,请注意,即使类型不同,值也是相同的 address。两者都与 memcpy 一起工作的原因是因为memcpy需要void*并且不关心类型。

于 2013-02-01T03:44:58.023 回答
1

myArray 和 &myArray 有什么区别?

它们都指向 myArray 的第一个元素。

数组的名称通常计算为数组第一个元素的地址,因此 myArray 和 &myArray 具有相同的值。

memcpy函数将目标内存地址作为输入参数。由于 myArray 和 &myArray 指向同一个地方,所以努力是一样的:

void* memcpy( void* dest, const void* src, std::size_t count );

Parameters
dest   -     pointer to the memory location to copy to
src    -     pointer to the memory location to copy from
count  -     number of bytes to copy
于 2013-02-01T03:45:45.417 回答