为它们分配了一个数组,出于兼容性原因,需要分配指针。为声明的数组引入数组赋值可能会引入错误,尽管伪赋值(a=b是指针赋值还是元素复制?)和其他问题(如何通过值传递数组?)并没有实际解决问题-只需使用memcpy将所有内容显式化 /* Example how array assignment void make things even weirder in C/C++, if we don't want to break existing code. It's actually better to leave things as they are... */ typedef int vec[3]; void f(vec a, vec b) { vec x,y; a=b; // pointer assignment x=y; // NEW! element-wise assignment a=x; // pointer assignment x=a; // NEW! element-wise assignment }

为它们分配了一个数组,出于兼容性原因,需要分配指针。为声明的数组引入数组赋值可能会引入错误,尽管伪赋值(a=b是指针赋值还是元素复制?)和其他问题(如何通过值传递数组?)并没有实际解决问题-只需使用memcpy将所有内容显式化 /* Example how array assignment void make things even weirder in C/C++, if we don't want to break existing code. It's actually better to leave things as they are... */ typedef int vec[3]; void f(vec a, vec b) { vec x,y; a=b; // pointer assignment x=y; // NEW! element-wise assignment a=x; // pointer assignment x=a; // NEW! element-wise assignment },c++,c,arrays,variable-assignment,struct,C++,C,Arrays,Variable Assignment,Struct,当1978年的C修订版添加了结构赋值()时,这一点并没有改变。尽管记录在C中是不同的类型,但在早期的K&R C中无法分配它们。您必须使用memcpy以成员方式复制它们,并且只能将指针作为函数参数传递给它们。assignment(和参数传递)现在被简单地定义为结构的原始内存的memcpy,因为这不能破坏现有的代码,所以它很容易被应用。作为一个意外的副作用,这隐式地引入了某种数组赋值,但这发生在结构内部的某个地方,因此这并不能真正引入数组使用方式的问题 我知道,每个回答的人都是C/C++方面的专家。

当1978年的C修订版添加了结构赋值()时,这一点并没有改变。尽管记录在C中是不同的类型,但在早期的K&R C中无法分配它们。您必须使用memcpy以成员方式复制它们,并且只能将指针作为函数参数传递给它们。assignment(和参数传递)现在被简单地定义为结构的原始内存的memcpy,因为这不能破坏现有的代码,所以它很容易被应用。作为一个意外的副作用,这隐式地引入了某种数组赋值,但这发生在结构内部的某个地方,因此这并不能真正引入数组使用方式的问题

我知道,每个回答的人都是C/C++方面的专家。但我想,这是主要原因

num2=num1

这里您试图更改数组的基址,这是不允许的

当然, struct2=struct1


这里,对象struct1被指定给另一个对象

在C中没有进一步加强数组的另一个原因可能是数组赋值没有那么有用。尽管在C中可以通过将其包装在结构中轻松实现(并且结构的地址可以简单地转换为数组的地址,甚至可以转换为数组的第一个元素的地址以进行进一步处理),但很少使用此功能。一个原因是不同大小的数组不兼容,这限制了赋值的好处,或者通过值传递给函数


在数组为一级类型的语言中,大多数具有数组参数的函数都是为任意大小的数组编写的。然后,函数通常迭代给定数量的元素,这是数组提供的信息。(在C语言中,习惯用法当然是传递一个指针和一个单独的元素计数。)一个只接受一个特定大小数组的函数并不经常需要,因此不会遗漏太多。(当你可以把它留给编译器来生成一个单独的函数来生成任何数组大小,就像C++模板一样,这就是为什么代码> STD::数组是有用的。)

我把C和C++都作为标签,因为这源于C。这也是一个很好的问题。结构分配通常是不可能的,您必须使用
memcpy()
或类似的方法。仅供参考
boost::array
()和现在的
std::array
()是凌乱的旧C数组的STL兼容替代品。它们支持拷贝分配。@EmileCormier,它们是--tada!--该页面讨论了如何将数组传递给函数(这是不可能做到的,所以它只是一个指针,这就是他所说的数组大小变小的意思)。这与将数组分配给数组无关。不,数组变量不仅仅是指向第一个元素的指针,它是一个数组。数组不是指针。谢谢你的评论,但当我读到这篇文章的那一节时,他预先说数组不知道自己的大小,然后用一个数组作为参数传递的例子来说明这一事实。因此,当数组作为参数传递时,它们是否丢失了有关其大小的信息,或者它们从来没有开始使用的信息。我假设是后者。编译器可以区分两个不同大小的数组之间的差异-尝试打印
sizeof(a)
vs.
sizeof(b)
或将
a
传递到
void f(int(&)[20])。了解每个数组大小都构成自己的类型很重要。参数传递规则确保您可以编写poor man的“泛型”函数,这些函数可以接受任何大小的数组参数,而代价是需要单独传递大小。如果不是这样(在C++中,你可以而且必须!),定义特定大小数组的参考参数,那么你需要对每个不同大小的特定函数,显然是无稽之谈。我在中写过。为什么数组是不可变的?或者更确切地说,为什么不像在类类型中那样专门为数组定义赋值呢?@GMan:这是一个更有趣的问题,不是吗。对于C++,答案可能是“因为C是这样的”,对于C,我猜这只是因为语言的进化(即,原因是历史的,不是技术的),但是当大多数发生时,我还没有活着,所以我留给更有见识的人来回答:(FWIW,我在C90或C99基本原理文档中找不到任何内容)。有人知道“可修改左值”的定义在C++03标准中的何处吗?它应该在§3.10中。索引说它是在该页面上定义的,但不是。§8.3.4/5中的(非规范性)注释说“数组类型的对象不能修改,请参见3.10。”但是§3.10一次都没有使用“数组”这个词。@James:我也这么做了。它似乎是指一个删除的定义。是的,我一直想知道这一切背后的真正原因,但它似乎是个谜。我听过类似“通过意外分配数组来防止人们效率低下”这样的事情“但是这太荒谬了。”Gman,杰姆斯:如果你错过了它,最近有一个关于COMP.Lang.c++的讨论,并且仍然感兴趣。显然这不是因为数组不是可修改的LValk(数组肯定是一个左值,所有非const LV值都是可修改的)。,但因为
=
需要RHS上的右值,并且数组不能是右值!数组禁止左值到右值的转换,替换为左值到指针。
静态\u cast
没有任何好处
struct myStruct { int num[3]; };
struct myStruct struct1 = {{1,2,3}};
struct myStruct struct2;
struct2 = struct1;
auto V[10] (B)
or 
let V = vec 10 (BCPL)
struct {
    int inumber;
    char name[14];
};
auto V[10];
V=V+5;
/* Example how array assignment void make things even weirder in C/C++, 
   if we don't want to break existing code.
   It's actually better to leave things as they are...
*/
typedef int vec[3];

void f(vec a, vec b) 
{
    vec x,y; 
    a=b; // pointer assignment
    x=y; // NEW! element-wise assignment
    a=x; // pointer assignment
    x=a; // NEW! element-wise assignment
}