这是我用来获取数组长度的方法:
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));
}
我要么被扔石头要么愚蠢,我在做什么错了?
答案 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];
,一旦将其作为参数传递,它就是一个指针。