为什么下面的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的双指针?是因为数组名称不是真正的指针而是“数组”类型变量的标识符吗?
答案 0 :(得分:3)
为什么第一个memcpy看不到
arr1
和arr2
的双指针?
直截了当地说,因为它不是双指针。
是因为数组名称不是真正的指针,而是"数组的变量的标识符"类型?
绝对!这恰好是因为数组不是指针,尽管这两种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