如何将数组传递给使用sizeof的函数?

时间:2018-08-17 00:08:02

标签: c++ arduino

这是我用来获取数组长度的方法:

sizeof(counts) / sizeof(unsigned long)

现在我想用它来做一个简单的功能,

int length(unsigned long* input)
{
    return (sizeof(input) / sizeof(unsigned long));
}


unsigned long array[3];

sizeof(array) = 12
sizeof(unsigned long) = 4
sizeof(array) / sizeof(unsigned long) = 3

lenght(array) = 1

内部length()sizeof(array)返回4

当我将函数更改为:

时,编译器会抱怨
int length(unsigned long input)
{
  return (sizeof(input) / sizeof(unsigned long));
}

我要么被扔石头要么愚蠢,我在做什么错了?

3 个答案:

答案 0 :(得分:2)

template <typename T, size_t N>
size_t length(T (&input)[N])
{
    return N;
}

或者只使用std::extent

答案 1 :(得分:1)

您不能,因为该数组已衰减为指向其第一个元素的指针。 但是,您可以执行以下操作:

template<size_t N>
void foo(int (&array)[N]) {
    for(auto elem : array) use(elem);
}

template<typename T, size_t N>
size_t length(T (&)[N]) {
    return N;
}

否则,您可以使用std::array,这是在C ++中执行静态数组的正确方法

答案 2 :(得分:1)

您既不会被扔石头也不会傻(好吧,除非....)。 sizeof运算符只能在声明数组的范围内使用。将数组作为参数传递时,它将转换为指向数组第一个元素的指针。

因此length收到input作为unsigned long *。什么是unsigned long *? (提示:指针)。 sizeof (a pointer)是什么(提示:x86上通常为4字节,x86_64上通常为8字节)。

因此,尽管您可以在sizeof(input) / sizeof(unsigned long)被声明为数组的范围内使用input ,例如unsigned long array[3];,一旦将其作为参数传递,它就是一个指针。