以下函数的输出是“int *”,这意味着形式参数被转换为整数指针。这个设计有什么必要的原因吗?为什么我们不能保留数组类型?
// the output is "int *"
#include<typeinfo>
void Func(int ar[5])
{
printf("%s\n", typeid(ar).name();
}
int main()
{
int ar[5];
Func(ar);
return 0;
}
答案 0 :(得分:7)
这种设计是否有任何必要的原因?
这是来自C的历史包袱。假设 1 这很方便,因为你无论如何也无法通过数值传递数组。
如果要保留类型,可以使用引用或指针:
void Func(int (&ar)[5]);
或使用模板函数接受任意大小的数组:
template<std::size_t N> void Func(int (&ar)[N]);
答案 1 :(得分:2)
我想补充说这被称为“阵列衰变”,这里有一个很好的讨论:
http://www.lysator.liu.se/c/c-faq/c-2.html
在c ++中使用原始数组有点“c风格”。 True C ++ adepts使用std :: vector,它没有衰减和输入问题。然而,遗留代码充满了原始数组,“C ++”编译器必须遵循“C”规则才能提供兼容性。