将数组的值传递给函数时,C ++编译器 只传递数组的名称(数组开始的地址) 功能。解释为什么C ++编译器只传递一个名称 数组成一个函数,而不是数组的全部内容?
答案 0 :(得分:1)
"为什么"很简单。因为那是标准所说的。
[§4.2 ¶ 1]
“N T数组”或“未知数组的数组”的左值或右值 T“可以转换为”指向T“的prvalue类型。该 应用临时实现转换([conv.rval])。该 result是指向数组第一个元素的指针。
单个名称可用于单个中的多个不同功能 范围;这是函数重载(Clause [over])。所有声明 对于一个函数,应该在返回类型和 参数类型列表。使用函数确定函数的类型 遵守规则。每个参数的类型(包括功能 参数包)是由它自己的decl-specifier-seq和 声明符。 确定每个参数的类型后,任何 “T的数组”或函数类型T的参数被调整为 “指向T的指针。”生成参数类型列表之后 修改参数类型的顶级cv限定符将在删除时删除 形成功能类型。生成的转换参数列表 类型和省略号或函数的存在或不存在 参数包是函数的参数类型列表。 [注意:这个 转换不会影响参数的类型。对于 例如,
int(*)(const int p, decltype(p)*)
和int(*)(int, const int*)
是相同的类型。 - 结束说明]
答案 1 :(得分:0)
您的问题不正确。当你写
int foo[5] = {1,2,3,4,5};
f(foo);
您没有将foo
的名称传递给函数f
,而是将指针传递给foo
的第一个元素。函数f
知道它正在获得int*
,它知道int
有多大,所以它知道在内存中向前寻找第二,第三,第四等元素的距离。这是实现数组的最小最小值,这就是它受欢迎的原因。
在C ++ 11中,要传递一个知道它有多大的数组,请使用std::array
。这是一个知道它有多大的数组:
#include <array>
std::array<int, 5> foo {1,2,3,4,5};
f(foo);
foo[42] = 1; // compile-time error!
但是你需要写f
,以便它知道array
有多大:
void f(const std::array<int, 5>& ai); // this works
或使其模板化,因此它可以采用任何大小的数组:
template<size_t Size>
void f(const std::array<int, Size>& ai);
(甚至是任何类型的数组:)
template<typename T, size_t Size>
void f(const std::array<T, Size>& a);
或者,将数据存储在std::vector
中。它们有时效率低于std::array
或内置数组,但更灵活:
std::vector<int> foo {1,2,3,4,5};
f(foo);
...
void f(const std::vector<int>& foo);