当数组作为函数中的参数传递时,为什么数组的大小不同

时间:2016-12-09 21:27:55

标签: arrays function visual-c++ parameters sizeof

template <typename list_type>
int len(list_type list) {

    std::cout << sizeof(list);

    return (sizeof(list) / sizeof(list[1]));
}


int main() {

    int list[5] = {1, 2 ,3 ,5 ,4};

    std::cout << sizeof(list) << "\n";
    len(list);
}

当我运行程序时,我得到:20然后4。虽然它是相同的列表,为什么会有区别?

1 个答案:

答案 0 :(得分:1)

数组衰减为指针。

listint*中的len()int[5]中的main

作为mentioned here,有两种可能的解决方法:

  • 使用参考
  • 明确使用对数组类型的引用

如果您使用引用,那么它将起作用(指针不会衰减),但您仍然需要计算元素的数量:

#include <iostream>

template <typename list_type>
int len(list_type &list) {
    std::cout << sizeof(list) << '\n';
    return (sizeof(list) / sizeof(list[1]));
}

int main() {
    int list[5] = {1, 2 ,3 ,5 ,4};
    std::cout << sizeof(list) << "\n";
    auto element_count = len(list);
    std::cout << "There are " << element_count << " elements in the list.\n";
}

对于第二个选项,您将在编译时获得数组的大小:

#include <iostream>

template <typename list_type, size_t N>
int len(list_type (&list) [N]) {
    std::cout << sizeof(list) << '\n';
    return N;
}

int main() {
    int list[5] = {1, 2 ,3 ,5 ,4};
    std::cout << sizeof(list) << "\n";
    auto element_count = len(list);
    std::cout << "There are " << element_count << " elements in the list.\n";
}