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

C++: When using memcpy, what is the difference between myArray and &myArray?

本文关键字:myArray 什么 区别 C++ 使用 memcpy      更新时间:2023-10-16

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

在这种情况下:

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

这条线...

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

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

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

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

关于数组的两件事:

  • 数组"衰减"到其元素类型的指针。这就是第二个版本正常工作的原因。看到这个:数组名称是指针吗?

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


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

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

int* b = &a; // error

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

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

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