将数组传递给函数-指针与引用(C ++与C)

伊佐

关于将数组传递给函数的最佳实践,我有一个广泛的问题。

所以在过去,当我使用C进行编程时,我希望一个函数将其输入作为数组,我会声明函数的输入参数为指针。这工作得比较好。

但是,我已经开始使用C ++进行更多编程,并试图确定将数组传递给函数的最佳实践。因此,我注意到在C ++中流行通过引用传递对象,从而避免了昂贵的复制操作。但是,当我在Google中将数组传递给函数时,我读了一些语句,说数组是通过引用自动传递的...。那么这有什么用呢?为什么数组通过引用自动传递?假设我不希望函数修改数组,是否可以传递const数组?

我很难编译我的测试程序。因此,我很好奇是否有人可以解释将数组传递给C ++中的函数的含义以及它与C有何不同。

谢谢!

bames53

在C和C ++中,声明一个函数采用数组参数,例如下面的示例,实际上使该函数采用指针。例如:

void foo(int arr[]);

此功能签名与:

void foo(int *arr);

因此,当您尝试使用C或C ++传递数组时,已经避免了复制数组的任何开销。

为什么数组通过引用自动传递?

它们仅在宽松的意义上通过引用传递。它们实际上没有作为C ++参考传递,如下所示:

void foo(int (&arr)[10]); // arr is a reference to an array of 10 ints

C行为的原因是因为他们认为按值传递数组永远不会使用,因为它的复制成本很高。C ++具有相同行为的原因仅仅是为了兼容性。

经验表明,数组参数的特殊行为不是一个好主意,因此这是应避免在C ++中使用原始数组的众多原因之一。问题在于,以任何一种方式传递数组都是危险的:

void foo(int arr[10]) { arr[9] = 0; }

void bar() {
    int data[] = {1, 2};
    foo(data);
}

上面的代码是错误的,但是编译器认为一切都很好,并且不发出有关缓冲区溢出的警告。

而是使用std::arraystd::vector,它们具有一致的值语义,并且没有任何会产生上述错误的“特殊”行为。

假设我不希望函数修改数组,是否可以传递const数组?

你可以:

void foo(int const arr[]);
void foo(int const *arr);

void foo(int const (&arr)[10]);

因此,我很好奇是否有人可以解释将数组传递给C ++中的函数的含义以及它与C有何不同。

如果您使用在C语言中有效的语法,那么它实际上并没有什么不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++将指针数组传递给函数

来自分类Dev

将指针传递给接受C ++中的引用的函数

来自分类Dev

C-无法将数组引用传递给函数中的指针参数

来自分类Dev

将字符指针数组传递给C函数

来自分类Dev

将数组的指针传递给C中的函数

来自分类Dev

C将void指针数组传递给函数

来自分类Dev

C指针,了解如何将数组传递给函数

来自分类Dev

将结构数组传递给函数作为指针(C)

来自分类Dev

将指针传递给char数组作为函数的参数-C

来自分类Dev

C ++直接将数组传递给函数

来自分类Dev

将数组传递给C中的函数

来自分类Dev

将C数组传递给Rust函数

来自分类Dev

将char数组传递给函数C ++

来自分类Dev

将数组传递给类函数C ++

来自分类Dev

将指针传递给C ++中的函数

来自分类Dev

将结构指针传递给函数c ++

来自分类Dev

C ++:将指针向量传递给函数

来自分类Dev

将char指针传递给C函数

来自分类Dev

C - 将指针传递给函数

来自分类Dev

C ++如何将“ this”传递给指针引用

来自分类Dev

将指针(数组名称)传递给C / C ++中的函数

来自分类Dev

将2d数组传递给C ++中的函数

来自分类Dev

将2D数组传递给c中的函数

来自分类Dev

从Go将结构和结构数组传递给C函数

来自分类Dev

C编程,将char数组传递给函数

来自分类Dev

将2D数组传递给C函数

来自分类Dev

将字符串数组传递给C中的函数

来自分类Dev

将String数组作为输入传递给外部C函数

来自分类Dev

将数组作为参数传递给C函数