【问题标题】:C++: When using memcpy, what is the difference between myArray and &myArray? [duplicate]C++:使用 memcpy 时,myArray 和 &myArray 有什么区别? [复制]
【发布时间】:2013-02-01 03:39:40
【问题描述】:

可能重复:
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,这将是非常糟糕的!

【问题讨论】:

标签: c++ arrays pointers reference memcpy


【解决方案1】:

关于数组的两件事:

  • 数组“衰减”到其元素类型的指针。这就是第二个版本有效的原因。看到这个: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,因为它更惯用。

【讨论】:

    【解决方案2】:

    您认为类型不同是正确的。 &myArrayunsigned char(*)[](指向 unsigned char 数组的指针),myArray(当作为参数传递给函数时)变为类型 unsigned char*(指向 unsigned char 的指针)。但是请注意,即使类型不同,也有相同的地址。两者都使用 memcpy 的原因是因为 memcpy 采用 void* 并且不关心类型。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

      • 有很大的不同,如果显示sizeof(myArray)和sizeof(&myArray)就可以看出。
      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 2023-03-16
      • 2010-10-25
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多