函数参数

时间:2019-04-06 02:22:48

标签: c++ arrays function

我听不懂,所以请帮助我。 当我们将数组传递给任何函数,然后在函数参数中写入数组类型以获取它,但是为什么我们不在参数中初始化其大小。

2 个答案:

答案 0 :(得分:1)

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

Live Demo

在这种情况下,长度声明是一个完整的谎言。在函数定义中写入无意义的数字只会增加有人出错的风险。


如果必须将原始指针用于接受数组的函数参数,则函数还应接受size参数:

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

Live Demo

这也是很危险的,因为某人完全有可能传递错误的 大小并引起错误:

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

Live Demo

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

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

int main() {
    std::vector<int> arr(5);
    foo(arr);
}

Live Demo

如果您不知道要使用哪种容器;默认为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);
}

Live Demo

答案 1 :(得分:0)

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

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

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

您甚至可以为其创建模板

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