C数组声明和赋值?

我在这里问了一个关于结构的类似问题,但是我试图弄清楚C如何处理分配变量的事情,以及如果它们在function上相同的话,不允许将它们分配给彼此的原因。

可以说我有两个数组:

int x[10]; int y[10]; 

为什么x = y不能编译? 如果它们都是相同的“签名”,那么你不应该来回分配它们吗?

我是否可以通过允许我在C中执行此操作的方式声明这些内容? 你能够做到这一点对我有意义,但也许有办法可以做到这一点? 结构的Typedef似乎是解决方案,它对于数组声明和赋值是否相同?

我感谢你们的帮助,我是Stackoverflow的新手,但到目前为止它对我来说是一个非常好的资源!

简单地说,数组不可分配。 它们是“不可修改的左值”。 这当然引出了一个问题:为什么? 有关更多信息,请参阅此问题:

为什么C ++支持在结构中成员分配数组,但一般不支持?

数组不是指针。 这里的x 确实引用了一个数组,尽管在很多情况下这会“衰减”(被隐式转换)到指向其第一个元素的指针。 同样, y也是数组的名称,而不是指针。

你可以在结构中进行数组赋值:

 struct data { int arr[10]; }; struct data x = {/* blah */}; struct data y; y = x; 

但你无法直接使用数组。 使用memcpy

 int x [sz]; int *y = x; 

这个编译, y将与x相同。

这里的一些消息说数组的名称产生其第一个元素的地址。 并非总是如此:

 #include  int main(void) { int array[10]; /* * Print the size of the whole array then the size of a pointer to the * first element. */ printf("%u %u\n", (unsigned int)sizeof array, (unsigned int)sizeof &array[0]); /* * You can take the address of array, which gives you a pointer to the whole * array. The difference between ``pointer to array'' and ``pointer to the * first element of the array'' matters when you're doing pointer arithmetic. */ printf("%p %p\n", (void*)(&array + 1), (void*)(array + 1)); return 0; } 

输出:

 40 4 0xbfbf2ca4 0xbfbf2c80 

为了分配数组,您必须在数组内分配值。

即。 x = y相当于

 for(int i = 0; i < 10 < ++i) { x[i] = y[i]; } 

为了补充Blank的答案,我设计了以下程序:

 localhost:~ david$ cat test.c #include  #include  int main (int argc, char * argv []) { struct data { int c [2]; } x, y; xc[0] = xc[1] = 0; yc[0] = yc[1] = 1; printf("xc %p %i %i\n", xc, xc[0], xc[1]); printf("yc %p %i %i\n", yc, yc[0], yc[1]); x = y; printf("xc %p %i %i\n", xc, xc[0], xc[1]); printf("yc %p %i %i\n", yc, yc[0], yc[1]); return 0; } 

执行时,输出以下内容:

 xc 0x7fff5fbff870 0 0 yc 0x7fff5fbff860 1 1 xc 0x7fff5fbff870 1 1 yc 0x7fff5fbff860 1 1 

关键是要说明结构值的副本是如何发生的。

当说“int x [10]”说,“为10个整数保留一些空间并向我传递指向该位置的指针”。 因此,要使副本有意义,您需要对指向的内存进行操作,而不是“内存位置的名称”。

因此,对于复制,您可以使用for循环或memcpy()。

我已经使用了C编译器,它可以编译得很好……运行时代码会使x指向y的数组。

你会看到,在C中,数组的名称是指向数组开头的指针。 实际上,数组和指针基本上是可互换的。 您可以使用任何指针并将其索引为数组。

早在70年代初期开发C时,它就意味着相对较小的程序在抽象中几乎不会超过汇编语言。 在那种环境中,能够轻松地在数组索引和指针数学之间来回切换是非常方便的。 另一方面,复制整个数据arrays是一件非常昂贵的事情,而且几乎没有什么东西可以被鼓励或抽象出来。

是的,在这些现代时代,让数组的名称成为“整个数组”的简写,而不是“对数组前面的思考”更有意义。 然而,C并不是在这些现代时期设计的。 如果你想要一种语言,试试Ada。 x:= y确实有你所期望的; 它将一个数组的内容复制到另一个数组。