C++ 函数参数中数组的大小未指定

C++ 函数参数中数组的大小未指定,c++,arrays,function,C++,Arrays,Function,我不能理解,所以请帮助我。 WHRN将数组传递给任意函数,然后在函数参数中写入数组类型,以获取它,但为什么我们不在参数中初始化它的大小。C++中, < P> ,在可能时总是首选容器到原始指针或数组。< /强> < /P> 函数签名中的数组类型实际上是指针。以下三种声明完全相同: void foo(int a[10]); void foo(int a[]); void foo(int* a); 在这三种情况下,foo只接受一个参数:指向int的指针。当您将数组传递给该函数时,它隐式地衰减为指向其

我不能理解,所以请帮助我。
WHRN将数组传递给任意函数,然后在函数参数中写入数组类型,以获取它,但为什么我们不在参数中初始化它的大小。C++中,

< P> <强>,在可能时总是首选容器到原始指针或数组。< /强> < /P> 函数签名中的数组类型实际上是指针。以下三种声明完全相同:

void foo(int a[10]);
void foo(int a[]);
void foo(int* a);
在这三种情况下,
foo
只接受一个参数:指向
int
的指针。当您将数组传递给该函数时,它隐式地衰减为指向其第一个元素的指针

当数组衰减为指针时,数组的长度将丢失。这意味着将编译以下代码,但逻辑上是错误的:

void foo(int a[10]) {
    for (size_t i = 0; i < 10; ++i) {
        std::cout << a[i] << '\n';
    }
}

int main() {
    // Whoops, wrong size array!
    int arr[5] = {};
    foo(arr);
}

当然,您可以指定(固定)数组大小作为函数参数-您必须通过引用传递数组

void func(int (&x)[100]);
正在传递大小为100的int数组

你甚至可以为它制作一个模板

template<class T, size_t N> void func(T (&x)[N]) {...}
template void func(T(&x)[N]){…}

如果我理解您的问题:您不能按值传递C样式数组。他们总是通过地址传递。即使您在参数中添加了一个大小,它也会被一个指向元素类型的指针所取代。“我们将数组传递给任何函数…”-这是什么意思?如何通过?以身作则。一段实际的代码。
函数签名中的数组类型实际上是指针
,仅当按值传递时。
void foo(const std::vector<int>& a) {
    for (int i : a) {
        std::cout << i << '\n';
    }
}

int main() {
    std::vector<int> arr(5);
    foo(arr);
}
template <typename Container>
void foo(const Container& a) {
    for (int i : a) {
        std::cout << i << '\n';
    }
}

int main() {
    std::vector<int> arr(5);
    foo(arr);
    std::array<int, 5> arr2 = {};
    foo(arr2);
}
void func(int (&x)[100]);
template<class T, size_t N> void func(T (&x)[N]) {...}