在作为参数传递的数组上使用sizeof

Jim*_*ies 4 c++ arrays size sizeof

可能重复:
作为参数传递的Sizeof数组

鉴于下面的函数,我理解sizeof返回数组中类型指针的大小.

int myFunc(char my_array[5])
{
    return sizeof(my_array);
}
Run Code Online (Sandbox Code Playgroud)

但是,在未作为参数传递的数组上调用sizeof通常会返回数组的大小.

是什么导致这种不一致?将数组作为参数传递时获取数组大小的最佳方法是什么?

Alo*_*ave 9

是什么导致这种不一致?

数组的名称衰减为指向其第一个元素的指针.
将数组传递给函数时,会发生这种衰减,因此传递给的表达式sizeof是一个指针,从而返回指针大小.

但是,传递给的数组sizeof总是返回数组的大小,因为在这种情况下没有衰减到指针.

将数组作为参数传递时获取数组大小的最佳方法是什么?

不要按值传递它们,通过引用传递它们或将
传递大小作为函数的单独参数传递.


Ker*_* SB 6

你必须通过引用传递数组; 你不能按值传递数组(它们会衰减成指向第一个元素的指针):

int myFunc(char const (& my_array)[5])
{
    return sizeof(my_array);  // or just "return 5"
}
Run Code Online (Sandbox Code Playgroud)

如果要通过引用许多不同的本地数组来调用此函数,可以使用函数模板来推导数组大小:

template <unsigned int N>
int myFunc(char const (& my_array)[N])
{
    return sizeof(N);         // or "return N"
}
Run Code Online (Sandbox Code Playgroud)

但是你应该让函数返回一个unsigned int或一个std::size_t.在C++ 11中,您也可以将它们声明为constexpr.