当编制的下列代码:

void DoSomething(int Numbers[])
{
    int SomeArray[] = Numbers;
}

该VS2005编译器的抱怨与错误C2440:'初始化':不能把'int[]'到'int[]'

我理解,真的,它想要投的指针一系列其是不要工作。但是你怎么解释错误的人学习C++?

有帮助吗?

解决方案

有三件事你需要解释的人你想要帮助:

  1. 阵列不能通过价值的功能在C++。 做什么你都在试图这样做,你需要通过地址的开始阵列 DoSomething(), 以及阵列的大小在一个单独的 int (嗯, size_t, 但是我不会打扰说法)的论点。你可以得到的地址开始的一些阵列 myArray 与表达 &(myArray[0]).因为这是常有的事情要做,C++允许使用只是名字阵列--例如 myArray --得到的地址它的第一个元素。(可以是有益的,或者混淆,这取决于哪种方式看待它。) 为了让事情变得更加混乱、C++允许指定一系列类型(例如 int Numbers[])作为一个参数的一个函数,但秘密地对待这一参数,因为尽管它是一个宣布为指针(int *Numbers 在这种情况下)--你甚至可以做 Numbers += 5 内部 DoSomething() 让它指向一系列开始在第六位!

  2. 当你宣布一系列可变的,例如 SomeArray C++时,必须提供一个明确的尺寸或一个"initialiser清单", ,这是一个逗号分隔值的列表之间的括号。这是不可能的编译器,来推断阵列大小的根据另一阵你是试图初始化,因为...

  3. 你不能复制一个列入的另一个、或初始化的一个阵列从另一个在C++。 因此,即使参数 Numbers 真的是一个阵列(说的大小1000)和不指针,以及指定的大小 SomeArray (再次作为说1000),线路 int SomeArray[1000] = Numbers; 将是非法的。


去做你想要做的 DoSomething(), ,首先问自己:

  1. 我需要改变任何值 Numbers?
  2. 如果是这样,我想要防止的呼叫者看到这些变化?

如果回答两个问题是"没有",你不在的事实要复制 Numbers 在第一位--只使用它,而忘记了使一个独立的 SomeArray 阵列。

如果这两个问题的答案是"是的",你会需要做复印的 NumbersSomeArray 工作上,而不是。在这种情况下,你真的应该做的 SomeArray C++ vector<int> 而不是另一个阵列,因为这真的很简化了的东西。(解释的好处的矢量超过手册的动态存储器的分配,包括事实,即他们 可以 被初始化从其他阵列或载体,他们会叫件造必要的时候,同一架C-风格 memcpy().)

其他提示

说,有类型和不完全类型:

struct A;

是一个不完整型的结构体的称为A.虽然

struct A { };

是一个完整的类型被称为A.第一的大小尚未已知结构的,而第二个的大小是已知的。

有不完整的类类型,如上述结构体。但也有不完全的数组类型:

typedef int A[];

即称为A.它的大小是尚未公知的一个不完整的阵列型。你不能创建一个数组出来,因为编译器不知道数组有多大。但是你可以的使用的它创建一个数组,的,如果你初始化直线距离:

A SomeArray = { 1, 2, 3 };

现在,编译器知道该阵列是int阵列3层的元件。如果您尝试初始化一个指针数组,编译器将不会有任何比以前更聪明,并拒绝,因为这不会给它的阵列的要创建的尺寸。

在试图让错误消息的更多帮助,编译器实际上是混乱的事情。即使Numbers参数被声明为阵列,C / C ++不(不能)实际上传递数组 - 的Numbers参数实际上是一个指针

所以错误确实应该说"cannot convert from 'int *' to 'int []'"

但随后会有困惑 - “哎,有没有参与表达int*”,有人可能会说

有关这个原因,它确实是最好避免阵列参数 - 它们声明为指针,因为这就是你真正得到反正。和解释别人学习C / C ++应该教育他们的事实,阵列参数是虚构的 - 他们真的指针

当我试图解释什么,我总是试图深入到最低水平,并从那里建立。这是他们的方式,我喜欢学习的东西,我发现,人们更舒适,如果你开始与他们知道的基本知识,并从那里建立。

在这种情况下,我可能会喜欢的东西开始:

  

编译器试图做   分配,因为你写的   赋值操作。在C ++中,   不能直接分配给数组,   因为它没有内置的分配   运营商(任何种类的,只   初始化和索引支持   为阵列)。因为C ++支撑   重载操作符为类型,则   那么编译器会超载   赋值运算符为   “分配到”类型的取   “分配-从”类型作为其参数。   由于也没有超载   操作者对于int []这需要INT []   作为参数,编译器错误   行了,错误是告诉你   为什么编译器不能处理的行。

是的,它可能是矫枉过正VS只是说一些关于大小的知识,不完全类型,等我意识到这也是不完整的(如:没有初始化分配与正常分配等的讨论)。然而,我的目标通常是让人们在那里他们可以找出下一个答案本身,和你平时想展示的思维过程在回答到达。

也许你的回答可能是,“因为编译器不知道数组有多大。”

如果有明确的数组大小(可能为了清楚起见,一个typedef)你的例子可以工作,然后就可以边引入可变大小分配解释指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top