如本问题Copying one structure to another的答案所述,我们可以通过简单的赋值将结构元素的内容复制到另一个。 E1 = E2;
但是这个简单的赋值在复制数组元素时不起作用。有人可以提供解释吗?
感谢。
答案 0 :(得分:1)
数组是C中的二等公民:你不能将一个数组赋值给一个数组而你也不能从一个函数返回一个数组。
Chris Torek在comp.lang.c中提供了这个解释:
“请注意,V6 C也不支持struct-valued 参数和结构值返回值。那么,有人可能 想象一下,丹尼斯认为任何返回值都可以 不适合登记册是太多的工作投入 那时的编译器。“
答案 1 :(得分:1)
数组不是可修改的左值( "something that has a location (in memory)" )。这意味着虽然它是左值,但它不能是赋值运算符=
的左操作数。
在结构的情况下,除了赋值 * 之外,C不对整个结构提供操作。不能使用==
,!=
运算符来测试两个结构是否相等。
您可以创建虚拟结构来封装稍后将复制的数组:
struct
{
int arr[5];
} arr1, arr2;
您可以指定
arr1 = arr2;
* =
运算符只能用于兼容的结构类型。
答案 2 :(得分:0)
数组的名称是数组*的第一个元素地址的别名:
#include <stdio.h>
int main()
{
int foo[5] = {2, 3, 4, 5, 6};
int *bar = foo;
// now bar == foo, i.e. bar == &foo[0], so changing bar[2] changes foo[2]
// bar[2] works because of pointer arithmetic
printf(" foo is: %p\n",foo); // prints the address of the first element of foo
printf("&foo[0] is: %p\n", &foo[0]); // also prints the address of the first element of foo
printf(" bar is: %p\n", bar);
printf("&bar[0] is: %p\n", &bar[0]);
printf(" foo[2] is: %d\n", foo[3]);
printf(" bar[2] is: %d\n", bar[3]);
return 0;
}
*有一些例外。即sizeof foo != &foo[0]
。见How come an array's address is equal to its value in C?
因此,当您编写arr1 = arr2
时,编译器认为您只是引用数组的地址而不是整个数组。当您编写结构的名称时,编译器知道您将整个结构称为结构,而不仅仅是第一个成员。