函数参数中数组大小未指定

Unspecified size of array in function parameter

本文关键字:未指定 数组 参数 函数      更新时间:2023-10-16

我无法理解,所以请帮助我。 Whrn 我们将数组传递给任何函数,然后在函数参数中编写数组类型来获取它,但为什么我们不在参数中初始化它的大小。

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

void func(int (&x)[100]);

正在传递大小为 100 的 int 数组。

您甚至可以为其制作模板

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

在C++中,尽可能始终首选容器而不是原始指针或数组。

函数签名中的数组类型实际上是指针。 以下三个声明都是完全相同的:

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 foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << 'n';
}
}
int main() {
int arr[5] = {};
foo(arr, 5);
}

现场演示

不过,这也是危险的,因为完全有可能有人传递错误的大小并导致错误

void foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << 'n';
}
}
int main() {
int arr[5] = {};
//Whoops, passed the wrong size!
foo(arr, 10);
}

现场演示

因此,您应该首选使用容器:

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

现场演示

如果您不知道要使用哪种类型的容器;默认为std::vector。 如果您的函数必须支持多种类型的容器,请使用模板:

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);
}

现场演示