C++ 将数组的引用传递给函数
Posted
技术标签:
【中文标题】C++ 将数组的引用传递给函数【英文标题】:C++ Pass a reference to an array to function 【发布时间】:2017-07-20 17:02:03 【问题描述】:赋予函数 void main() 和 void hello(byte* a[4])。主函数有一个四个字节的数组。数组的引用需要传递给函数 hello 进行操作。我希望正确的语法是:
void hello(byte* a[4])
// Manipulate array
a[0] = a[0]+1;
void main()
byte stuff[4] = 0,0,0,0;
hello(&stuff);
// hopefully stuff is now equal 1,0,0,0
另外,我看到其他人使用这种贬义形式:
void hello(byte (&a)[4])
这是正确的做法吗?
【问题讨论】:
改用std::array<byte,4>&
。
使用hello(&stuff)
,你传递一个指向hello
的指针,除此之外你应该使用std::array
,std::vector
或任何其他标准容器而不是byte stuff[4]
使用 std::vector 或 std::array 的好处或动机是什么?
如果有的话,原始数组有一种令人讨厌的趋势,即使用 std::array 避免这种情况衰减到指向其第一个元素的指针。将 std::array 传递给函数时,如果它的值、指针或引用与原始数组相比,它也更清晰(imo)。还有更多原因,但这两个足以让我几乎一直更喜欢 std::array 而不是原始数组。
使用标准容器的好处是他们会关心容器相关的内存管理。这更容易阅读容器是如何在代码中传递的,以及存储了什么样的数据。此外,您还可以受益于 std 库提供的所有方法和实用功能。
【参考方案1】:
这里有很多不同的选项,这取决于你想在这里做什么。
如果你有一个 byte
对象的原始数组,你可以将它传递给这样的函数:
void hello(byte arr[])
// Do something with arr
int main()
byte arr[4];
hello(arr);
数组传递给函数的机制(指向数组第一个元素的指针传递给函数)的功能类似于传递引用:您对@987654324 中的arr
所做的任何更改@ 将坚持 main
即使您没有明确传递对它的引用。但是,hello
函数不会检查数组的大小是否为 4 - 它会将 任意 个字节数的数组作为输入。
你也可以写
void hello(byte (&arr)[4])
// ...
int main()
byte arr[4];
hello(arr);
语法byte (&arr)[4]
表示“对四个字节数组的引用”。这通过引用显式地将数组传递给hello
,它将检查数组的大小以确保它是正确的。然而,这是一种非常不寻常的语法,在实践中很少见。
但也许最好的办法是不使用原始数组,而是使用std::array
:
void hello(std::array<byte, 4>& arr)
// Do something with arr
int main()
std::array<byte, 4> arr;
hello(arr);
现在,对于字节数组的语法中的奇怪括号已经没有什么奇怪的地方了,也不必担心大小检查。一切都得到了妥善处理,因为std::array
是一种对象类型,它具有常规对象类型的所有优点。我建议在所有其他方法之上使用最后一种方法。
【讨论】:
【参考方案2】:数组已经通过指针传递了。
所以这个:
int a(int array[])
和这样做是一样的:
int a(int * array)
这样做:
void hello(byte (&a)[4])
只允许传入长度为4的数组。
【讨论】:
这不是“通过引用传递”的意思。 小心 - “通过引用传递”具有特定含义。如果将数组传递给函数,实际上是将指向数组第一个元素的指针(按值)传递给函数。【参考方案3】:byte* a[4]
是一个由四个指向 byte
的指针组成的数组,参数列表除外。
在参数列表中,它是一个指向byte
的指针——即它等价于byte**
。
byte (*a)[4]
是一个指向四元素数组的指针。
byte (&a)[4]
是对四元素数组的引用。
在你的例子中,&stuff
是一个指向四元素数组的指针,所以你的参数应该是byte (*a)[4]
。
【讨论】:
以上是关于C++ 将数组的引用传递给函数的主要内容,如果未能解决你的问题,请参考以下文章