将addressof与2个数组的memcpy一起使用

将addressof与2个数组的memcpy一起使用,c,arrays,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的双指针?这是因为数组名不是真正的指针,而是“数组”类型变量的标识符吗?因为在C中,当a是数组时,我们有: (v

为什么下面的
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的双指针?这是因为数组名不是真正的指针,而是“数组”类型变量的标识符吗?

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

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

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

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

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

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

Duplicate of—“数组的名称通常计算为数组的第一个元素的地址,因此数组和&array具有相同的值。”

Duplicate of—“数组的名称通常计算为数组的第一个元素的地址,因此数组和&array具有相同的值。”

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

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

为什么第一个memcpy没有看到
arr1
arr2
的双指针

坦率地说,因为它不是一个双指针

是不是因为数组名不是真正的指针,而是“array”类型变量的标识符

绝对是!这恰恰是因为数组不是指针,尽管这两种C对象有许多令人误解的相似之处

行为是相同的,因为当传递到
memcpy
时,两个表达式都会生成数值相同的
void*
指针

为什么第一个memcpy没有看到
arr1
arr2
的双指针

坦率地说,因为它不是一个双指针

是不是因为数组名不是真正的指针,而是“array”类型变量的标识符

绝对是!这恰恰是因为数组不是指针,尽管这两种C对象有许多令人误解的相似之处


行为是相同的,因为这两个表达式在传递到数组中的
memcpy

时都会生成数值相同的
void*
指针,数组变量(arr1和arr2)自然表示数组的基址,您不需要给出&(运算符地址)。
arr1==&arr1

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

如果是重复的,请使用标志按钮,不要发布只指向其他问题的答案。@jarmod谢谢,我在发布之前没有找到这个问题。抱歉。如果是重复的,请使用标志按钮,不要发布只指向其他问题的答案。@jarmod谢谢,我在发布之前没有找到这个问题。抱歉。可能重复(offtopic:passing
5
因为memcpy中的大小错误)可能重复(offtopic:passing
5
因为memcpy中的大小错误)谢谢。更新了我的问题。草率的伪代码,我道歉。谢谢。更新了我的问题。草率的伪代码,我道歉。