你怎么做意义上的错误:不能把'int[]'到'int[]'
-
22-08-2019 - |
题
当编制的下列代码:
void DoSomething(int Numbers[])
{
int SomeArray[] = Numbers;
}
该VS2005编译器的抱怨与错误C2440:'初始化':不能把'int[]'到'int[]'
我理解,真的,它想要投的指针一系列其是不要工作。但是你怎么解释错误的人学习C++?
解决方案
有三件事你需要解释的人你想要帮助:
阵列不能通过价值的功能在C++。 做什么你都在试图这样做,你需要通过地址的开始阵列
DoSomething()
, 以及阵列的大小在一个单独的int
(嗯,size_t
, 但是我不会打扰说法)的论点。你可以得到的地址开始的一些阵列myArray
与表达&(myArray[0])
.因为这是常有的事情要做,C++允许使用只是名字阵列--例如myArray
--得到的地址它的第一个元素。(可以是有益的,或者混淆,这取决于哪种方式看待它。) 为了让事情变得更加混乱、C++允许指定一系列类型(例如int Numbers[]
)作为一个参数的一个函数,但秘密地对待这一参数,因为尽管它是一个宣布为指针(int *Numbers
在这种情况下)--你甚至可以做Numbers += 5
内部DoSomething()
让它指向一系列开始在第六位!当你宣布一系列可变的,例如
SomeArray
C++时,必须提供一个明确的尺寸或一个"initialiser清单", ,这是一个逗号分隔值的列表之间的括号。这是不可能的编译器,来推断阵列大小的根据另一阵你是试图初始化,因为...你不能复制一个列入的另一个、或初始化的一个阵列从另一个在C++。 因此,即使参数
Numbers
真的是一个阵列(说的大小1000)和不指针,以及指定的大小SomeArray
(再次作为说1000),线路int SomeArray[1000] = Numbers;
将是非法的。
去做你想要做的 DoSomething()
, ,首先问自己:
- 我需要改变任何值
Numbers
? - 如果是这样,我想要防止的呼叫者看到这些变化?
如果回答两个问题是"没有",你不在的事实要复制 Numbers
在第一位--只使用它,而忘记了使一个独立的 SomeArray
阵列。
如果这两个问题的答案是"是的",你会需要做复印的 Numbers
在 SomeArray
工作上,而不是。在这种情况下,你真的应该做的 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)你的例子可以工作,然后就可以边引入可变大小分配解释指针。