数组传递给函数

时间:2016-12-18 21:08:35

标签: c++ arrays function

将数组的值传递给函数时,C ++编译器 只传递数组的名称(数组开始的地址) 功能。解释为什么C ++编译器只传递一个名称 数组成一个函数,而不是数组的全部内容?

2 个答案:

答案 0 :(得分:1)

"为什么"很简单。因为那是标准所说的。

[§4.2 ¶ 1]

  

“N T数组”或“未知数组的数组”的左值或右值   T“可以转换为”指向T“的prvalue类型。该   应用临时实现转换([conv.rval])。该   result是指向数组第一个元素的指针。

[§8.3.5 ¶ 5]

  

单个名称可用于单个中的多个不同功能   范围;这是函数重载(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);