C ++:使用memcpy时,myArray和& myArray有什么区别?

时间:2013-02-01 03:39:41

标签: c++ arrays pointers reference memcpy

  

可能重复:
  How come an array’s address is equal to its value in C?

在这种情况下:

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

这一行...

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

...正在产生相同的结果:

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

我非常喜欢C ++,但我的印象是数组只是指向数据的指针。当& myArray与myArray完全相同时,我感到很震惊。我原本以为它会试图复制到指针的ADDRESS,这将非常糟糕!

3 个答案:

答案 0 :(得分:4)

关于数组的两件事:

  • 数组“衰减”到其元素类型的指针。这就是第二个版本正在运行的原因。请参阅:Is an array name a pointer?

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


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

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

int* b = &a; // error

由于memcpy的参数是void*,它接受​​任何指针类型,&myArraymyArray都有效。我会建议使用myArray,因为它更具惯用性。

答案 1 :(得分:1)

你认为类型不同是正确的。 &myArrayunsigned char(*)[](指向无符号字符数组的指针)和myArray(当作为参数传递给函数时)变为类型unsigned char*(指向unsigned char的指针) )。但请注意,即使类型不同,也有值相同地址。使用memcpy的原因是因为memcpy需要void*并且不关心该类型。

答案 2 :(得分: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