函数原型和数组参数

Posted

技术标签:

【中文标题】函数原型和数组参数【英文标题】:function prototype and array parameters 【发布时间】:2015-10-20 06:59:46 【问题描述】:

我正在学习 C++ 语法,并且已经到了研究数组的地步。 我想问你一个问题,但首先让我回顾一下,这样我就知道我明白了。 我知道您可以使用以下语法将变量定义为数组:

<base type> name [<size(constexpr)>]

(大小是数组类型的一部分)。 这会给我一个 base 类型size 元素数组 如果我想要一个指向 基本类型的指针数组,我可以在基本类型说明符之后添加一个 *,就像在普通指针声明中一样。

<base type> *name [<size(constexpr)>]

我无法定义引用数组,因为 aray 应该只包含对象(引用只是别名)。

现在,如果我想声明一个引用或指向数组的指针,我可以使用以下语法:

<base type> (&name) [<size(constexpr)>]

<base type> (*name) [<size(constexpr)>]

到目前为止,一切都清楚了。 我还知道,我可以将数组作为参数传递给函数,但该调用将始终被解释为我正在传递指向数组元素类型的指针。 声明如下的函数:

void f(int array[10])

等同于:

void f(int array[])
void f(int *p)

每当我调用这个函数时,我总是传递一个 int*(按值传递)。

问题: 如果我想在不使用参数名称的情况下编写函数原型(纯声明)怎么办?我知道在这种情况下我通常可以省略参数名称(我可以写void f(int*),但其他两个声明呢?)。更重要的是,如果参数是引用或指向数组的指针怎么办?

void f(int (&array)[])

void f(int (*array)[])

谢谢!

【问题讨论】:

你试图省略名字吗? 【参考方案1】:

这很好:

void f(int[])
void f(int*)

这也是:

void f(int (*)[])

指针是一个指针。在这种情况下它指向一个数组,但它仍然是一个指针。

但是,这是不允许的:

void f(int (&)[])

无论是否指定名称。这将参数声明为“对未知边界数组的引用”,这是不允许的。如果您想接收对未知大小数组的引用,您可以使用模板:

template <size_t N>
void f(int (&array)[N]);

这是完全有效的。当然,固定大小的数组(编译时大小)也可以不带名字出现:

void f(int (&)[32]) //Ok

【讨论】:

我不能直接添加尺寸吗? 是的,你可以。但在这种情况下,我们回到固定大小的数组,一切都照常工作。我将这一点添加到我的答案中。

以上是关于函数原型和数组参数的主要内容,如果未能解决你的问题,请参考以下文章

javascript原型,原型链 有啥特点

JS原型

JS高级 构造函数和原型 + 继承 + ES5新增方法

深入理解javascript原型和闭包——函数和对象的关系

原型链构造函数箭头函数se6数组去重

深入理解javascript原型和闭包——函数和对象的关系 (转载)