Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中复制结构元素与复制数组元素_C_Arrays_Copy_Structure - Fatal编程技术网

在C中复制结构元素与复制数组元素

在C中复制结构元素与复制数组元素,c,arrays,copy,structure,C,Arrays,Copy,Structure,正如这个问题的答案中所描述的,我们可以通过简单的赋值将一个结构元素的内容复制到另一个结构元素。 e1=e2 但是当复制数组元素时,这个简单的赋值不起作用。有人能解释一下吗 谢谢 数组在C中是二等公民:不能将数组分配给数组,也不能从函数返回数组 Chris Torek在comp.lang.c.中提供了这一解释: “请注意,V6 C也不支持结构值 参数和结构值返回值, 想象一下,Dennis计算出任何返回值 不适合登记是太多的工作投入到 “在这一点上,编译器。” 数组不是可修改的左值。这意味着尽管它

正如这个问题的答案中所描述的,我们可以通过简单的赋值将一个结构元素的内容复制到另一个结构元素。 e1=e2

但是当复制数组元素时,这个简单的赋值不起作用。有人能解释一下吗


谢谢

数组在C中是二等公民:不能将数组分配给数组,也不能从函数返回数组

Chris Torek在comp.lang.c.中提供了这一解释:

“请注意,V6 C也不支持结构值 参数和结构值返回值, 想象一下,Dennis计算出任何返回值 不适合登记是太多的工作投入到 “在这一点上,编译器。”


数组不是可修改的左值。这意味着尽管它是左值,但不能是赋值运算符
=
的左操作数

对于结构,除了赋值*,C不提供对整个结构的操作。不能使用
==
=运算符以测试两个结构是否相等

您可以创建虚拟结构来封闭稍后将复制的阵列:

struct
{
    int arr[5];
} arr1, arr2;
后者可以指定

arr1 = arr2;  


*
=
运算符只能用于兼容的结构类型。

数组的名称是数组第一个元素地址的别名*:

#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;

}
#包括
int main()
{
int foo[5]={2,3,4,5,6};
int*bar=foo;
//现在bar==foo,即bar==&foo[0],因此更改bar[2]会更改foo[2]
//由于指针运算,条[2]起作用
printf(“foo是:%p\n”,foo);//打印foo的第一个元素的地址
printf(“&foo[0]是:%p\n”,&foo[0]);//还打印foo的第一个元素的地址
printf(“条形图为:%p\n”,条形图);
printf(“&bar[0]为:%p\n”,&bar[0]);
printf(“foo[2]是:%d\n”,foo[3]);
printf(“条[2]为:%d\n”,条[3]);
返回0;
}
*除了一些例外。即
sizeof foo!=&foo[0]
。看


因此,当您编写
arr1=arr2
时,编译器认为您只是引用了数组的地址,而不是整个数组。编写结构的名称时,编译器知道您引用的是整个结构,而不仅仅是第一个成员。

“复制数组元素时不起作用”请给出一个复制数组元素不起作用的例子。请展示一段不起作用的代码:分配恰好是
struct
s的数组元素可以很好地工作,这是一个数组到数组的分配不起作用。它主要是一个历史工件。您可以指定一个
struct-wrapped_数组{intx[10];}很好。值得注意的是,至少在理论层面上,标准可以轻松支持将一个数组复制到另一个数组,以及从函数返回本地数组。编译器也可以很容易地支持这一点(就像它们支持复制和返回结构一样)。我无法理解为什么直到最近才更新标准来支持这一点。