可能重复:
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,这将非常糟糕!
答案 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*
,它接受任何指针类型,&myArray
和myArray
都有效。我会建议使用myArray
,因为它更具惯用性。
答案 1 :(得分:1)
你认为类型不同是正确的。 &myArray
是unsigned 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