如何防止数组在传递给函数时被解释为指向第一个元素的指针?

时间:2015-02-22 06:03:22

标签: c++

我理解隐式转换为指针。今天有人在其他问题上提出了类似的建议:

#include <iostream>

void printArray(int (&a)[5]) {
    for (int i : a) {
        std::cout << i << " ";
    }
}

int main() {
    int a[] = { 1, 2, 3, 4, 5 };
    printArray(a);
}

问题

  1. 这是将整个数组传递给函数的唯一和最好的方法,而不仅仅是指向第一个元素的指针(虽然效率低下)?

  2. 但是,如果要将该函数写在main函数下面,那么函数原型是什么?

  3. 另外,如果我只使用增强的for循环遍历传递给函数的数组的元素,还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

1)这不会将整个数组传递给函数。它传递对数组的引用。由于编译器知道参数的类型,因此能够进行适当的检查(在调用函数时)和访问数组元素(在函数内)。

2)函数的声明(与定义/实现相对)将是;

void printArray(int (&a)[5]);

参数的名称(a)在此可选。

3)由于打印对象(包括数组)通常不会更改对象,因此printArray()的参数为const是合格的。这也允许调用者传递const数组(这在代码中是不可能的,如图所示)。此外,循环中使用的i类型也可以是const引用(这可以避免按值复制数组的元素)。也可以使用自动类型推断(即auto)。增加const - 安全性通常被视为有益(因为它增加了尝试修改不应更改的内容的机会)。