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

标签 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. 但是,如果该函数写在主函数下面,函数原型(prototype)会是什么?

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

最佳答案

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

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

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

这里参数的名称(a)是可选的。

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

关于c++ - 如何防止数组在传递给函数时被解释为指向第一个元素的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28655069/

相关文章:

c++ - 我可以在不创建类的情况下创建插槽吗?

python - 将脚本语言嵌入到游戏引擎的编程语言中的目的是什么?

c++ - 双指针内存分配

c++ - 使用 CMake 和 VS 从 Windows 上的现有代码生成 dll

c++ - 如何在使用模板时将cpp代码编译成库文件

C++ 和类对象名称

c++ - 'new' 语句是否会在不抛出异常的情况下失败?

c++ - 从对象 vector 访问数据

c++ - 是否可以从 SFML 中的音频样本中拆分左右声道?

c++ - C++ 中 std::unique_ptr 和 std::shared_ptr 的区别