包含数组';函数声明中的大小? 我理解数组如何传递给C++中的函数,但是我不理解在这个函数大小被忽略的情况下,数组的大小在函数声明中的意义是什么,因为我们真正传递给函数的是指向数组的第一个元素的指针。
例如,如果我们有以下代码:包含数组';函数声明中的大小? 我理解数组如何传递给C++中的函数,但是我不理解在这个函数大小被忽略的情况下,数组的大小在函数声明中的意义是什么,因为我们真正传递给函数的是指向数组的第一个元素的指针。,c++,arrays,C++,Arrays,例如,如果我们有以下代码: void ArrayTest1(int(&ints)[3]) { for (int i = 0; i < 3; i++) std::cout << ints[i]; } void ArrayTest2(int ints[3]) { for (int i = 0; i < 3; i++) std::cout << ints[i]; } void ArrayTest3(int ints[]) { fo
void ArrayTest1(int(&ints)[3])
{
for (int i = 0; i < 3; i++) std::cout << ints[i];
}
void ArrayTest2(int ints[3])
{
for (int i = 0; i < 3; i++) std::cout << ints[i];
}
void ArrayTest3(int ints[])
{
for (int i = 0; i < 3; i++) std::cout << ints[i];
}
int main()
{
int ints[] = { 1, 2 };
//ArrayTest1(ints); //won't compile
ArrayTest2(ints); //ok
ArrayTest3(ints); //ok
return 0;
}
void ArrayTest1(int(&int)[3])
{
对于(inti=0;i<3;i++)std::cout我不知道为什么C允许这样做(是的,这来自C),但这确实是毫无意义的
更糟糕的是,“错误”的维度会对代码的读者产生误导
我们可能会争辩说,这是为了保持语言语法的简单,因为声明符的语法已经使维度成为可选的(考虑intx[]={1,2,3}
vsintx[3]={1,2,3}
)
也许有些人用它来记录意图;我当然不会。
< P> C++的主要设计目标之一是与C的兼容性很强。不支持C数组使用的所有方面都将严重损害这个目标。
你的例子甚至给出了一个很好的迹象,说明兼容性确实是目的,如果没有的话,C++会有不同的效果。考虑你的代码> ARARYTEST1()/<代码>。它引用了一个C数组,在C.中不存在的东西,在这种情况下数组维数是显著的。
// C-array of length 3 taken by reference
void foo(int (&x)[3]);
void bar() {
int a[4] = {1,2,3,4};
foo(a); // Does not compile. Wrong array size.
}
只有ArrayTest2()
和ArrayTest3()
完全等同于:
void foo(int*);
Bjarne Stroustrup:如果你对C++为什么设计的方式很感兴趣的话,它是一个很好的阅读版。尝试<代码> siZeof(INTS)< /代码>并查看不同之处:<代码> int [INS](3)< /C> >完全等于int INT[]在ArayTest2中使用的语法仅仅是为了表明这个函数期望一个数组有3个元素,并且数组的大小不同会导致错误。-是的,或者编码器是C++的新的,并且实际上相信它们正在通过数组。Test2
。它被完全忽略了。为什么C的设计者决定放弃它?这是一个好问题,我不知道答案。也许他们想迷惑新手。而且,必须避免使用传统的C数组。它们是麻烦,并且是许多未定义行为错误的来源。在大多数情况下,使用std::vector
,std::a对于其他人,请使用rray
。此外,要学会通过引用传递容器(如果可能的话,请使用const)以避免复制。“语言语法”点充其量是多余的,最糟糕的是错误的。[]
和[n]
是声明符,语言语法已经将它们组合在一起,用于普通变量声明。我想说的是,将分组用于参数声明实际上“更简单”,而不是尝试显式地说“不允许有边界”(注意:现代C实际上将“复杂度”加倍,并添加了[Cyt> /Case> [StimeN] 参数声明。指出它是无用的,不应该被使用的是好的,我同意,但是实现关注并不重要。@ HTNW HMM,是的。这有两个答案:(a)C++也接受引用,尽管这不是我们在这里讨论的;(b)C做到了。信息量不大:(