使用带有2个数组的memcpy的addressof

时间:2014-06-13 12:36:39

标签: c arrays

为什么下面的memcpy产生相同的结果:

int arr1[5] = {some_data1};
int arr2[5] = {some_data2};

memcpy(&arr1, &arr2, (5 * sizeof(int)));
memcpy(arr1, arr2, (5 * sizeof(int)));

为什么第一个memcpy看不到arr1和arr2的双指针?是因为数组名称不是真正的指针而是“数组”类型变量的标识符吗?

5 个答案:

答案 0 :(得分:3)

  

为什么第一个memcpy看不到arr1arr2的双指针?

直截了当地说,因为它不是双指针。

  

是因为数组名称不是真正的指针,而是"数组的变量的标识符"类型?

绝对!这恰好是因为数组不是指针,尽管这两种C对象共享了许多误导性的相似之处。

行为是相同的,因为两个表达式在传递给void*时会生成数字相同的memcpy指针。

答案 1 :(得分:1)

因为在C中,当a是一个数组时,我们有这个:

 (void *) a == (void *) &a

&a(指向数组的指针)和&a[0](指向数组的第一个元素的指针)的地址是相同的,只有类型不同。

答案 2 :(得分:0)

this question的复制 - “数组的名称通常计算为数组第一个元素的地址,因此数组和&数组具有相同的值。”

答案 3 :(得分:0)

在某些情况下,当您使用数组名称时,它将转换为数组的地址。将数组作为函数参数传递是这些上下文之一。但是使用带有&运算符的数组不是 - 它返回数组的地址。

答案 4 :(得分:0)

在数组中,您的数组变量(arr1 amd arr2)自然代表数组的基址,您不需要给&(运算符的地址)。 arr1 ==& arr1