数组传递到函数

Array passing to function

本文关键字:函数 数组      更新时间:2023-10-16

将数组的值传递到函数时,C 编译器仅将数组的名称(数组开始的地址)传递到功能。解释为什么C 编译器仅通过一个名称数组中的函数,而不是数组的整个内容?

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

[§4.2¶1]

" n t的数组"或"未知绑定的数组 t"可以转换为"指针t"类型的序言。这 应用临时物质化转换([Cons.rval])。这 结果是指向数组的第一个元素的指针。

[§8.3.5¶5]

单个名称可以用于单个不同功能 范围;这是函数过载(子句[Over])。所有声明 因为一个函数应完全同意返回类型和 参数类型列表。使用函数的类型使用 以下规则。每个参数的类型(包括功能 参数包)是根据其自己的Decl-Scifier-seq和 声明人。确定每个参数的类型后,任何 " T"类型的参数或函数t型t类型的参数已调整为 "指向t"。产生参数类型列表后 当修改参数类型的顶级CV- Qualifier被删除 形成功能类型。最终的转换参数列表 椭圆或功能的类型,存在或不存在 参数包是函数的参数类型列表。[注意:这个 转换不会影响参数的类型。为了 例如,int(*)(const int p, decltype(p)*)int(*)(int, const int*) 是相同的类型。 - 终注]

您的问题不正确。当你写

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 s中。有时它们的效率不如std::array或内置阵列,但更灵活:

std::vector<int> foo {1,2,3,4,5};
f(foo);
...
void f(const std::vector<int>& foo);