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::arraystd::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 (&amp;a)[4] 是对四元素数组的引用。

在你的例子中,&amp;stuff 是一个指向四元素数组的指针,所以你的参数应该是byte (*a)[4]

【讨论】:

以上是关于C++ 将数组的引用传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

将字符串的引用从 C# 传递给 C++ 函数

通过引用将字符串数组传递给 C 函数

Javascript 是不是通过引用或值将数组传递给函数?

C++ 通过引用传递向量字符指针

将c ++引用的地址传递给指针

C,如何将多维数组传递给 CLR/类库项目中的函数