数组传递到函数
Array passing to function
将数组的值传递到函数时,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);
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中