c++ - 函数原型(prototype)和数组参数

标签 c++ arrays pointers reference

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

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

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

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

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

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

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

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

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

void f(int array[10])

等同于:

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

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

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

void f(int (&array)[])

void f(int (*array)[])

谢谢!

最佳答案

这很好:

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

关于c++ - 函数原型(prototype)和数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698035/

相关文章:

c++ - 代码无法打印出整个字符串并突然结束

c++ - 给定基指针访问派生属性和方法的更简单方法

C++ 范围像 Java 流一样查找并返回 std::optional

c++ - 在 C++ 中填充动态分配的数组

c++ - QFileSystemModel - 增量更新/抢先更新

Java泛型将字节数组转换为字符串(非十六进制,十进制)

PHP:从 MySQL 中的内爆数组中选择一个值

arrays - Node/Mongoose - 如果更新期间对象尚不存在,则无法在数组中创建对象

c - 如何将整数转换为 uint8_t 指针?

c++ - "warning: operation of ... may be undefined"用于三元运算——不是 if/else block