包含数组';函数声明中的大小? 我理解数组如何传递给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}
vs
intx[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做到了。信息量不大:(