c ++将数组传递给函数问题

时间:2011-08-24 13:41:39

标签: c++ arrays

如何将数组参数传递给函数,并计算数组参数的大小?因为每次我尝试计算它时,返回值总是为4。

感谢快速回复。我将要传递数组的大小。或者我给向量一个镜头。感谢

5 个答案:

答案 0 :(得分:11)

您可以使用here所述的模板执行此操作:

template<size_t Size>
void AcceptsArray( ParameterType( &Array )[Size] )
{
    //use Size to find the number of elements
}

它被称为:

ParameterType array[100];
AcceptsArray( array ); //Size will be auto-deduced by compiler and become 100

唯一的缺点是你现在有一个模板化的功能,这会增加代码膨胀。这可以通过将调用重定向到接受第一个元素的地址和元素数量的非模板化函数来解决。

答案 1 :(得分:7)

这是(一个)数组和指针之间的区别。获取数组的大小会导致其大小以字节为单位,而获取指针的大小会产生该系统上指针的大小。 但是,无论何时将数组传递给函数,它都会衰减为指针,无论指针的类型是什么类型(32位机器上的4),指针的大小始终相同。 / p>

从技术上讲,将数组传递给函数是不可能的,因为无论何时尝试,它都会成为指针。

您还需要将数组的大小传递给函数,或者更好,如果可以,请使用std::vectorstd::array,或std::string如果您'重新使用数组作为C风格的字符串。

答案 2 :(得分:2)

在C ++中,使用原始数组被认为是一个不好的实践。您应该考虑使用std::vectorboost::array代替。

如果你不跟踪大小或在最后提供某种监护人价值,很难计算数组的size。例如,在C-strings( not std::strings)中,'\ 0'字符标记字符串的结尾(char数组)。

答案 3 :(得分:1)

这适用于g ++:

template <typename T>
std::size_t size_of_array (T const & array)
{
    return sizeof (array) / sizeof (*array);
}

int main ()
{
    int x [4];
    std::cout << "size: " << size_of_array (x) << '\n';
}

我想这是因为函数是内联的,但在这种情况下,数组似乎仍然没有衰减。有人能解释一下原因吗?

答案 4 :(得分:0)

如果您正在使用c数组,那么它是不可能的,因为它们在将它传递给函数时会自动转换为指针。所以4是指针的大小。

解决方案:使用std::vector

#include <vector>

int carray[] = {1,2,3,4};
std::vector<int> v(carray, carray + sizeof(carray)/sizeof(int));

my_function(v);