C++ 将数组的引用作为参数传递给函数

9

给定函数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])

这样做是正确的吗?


3
请使用 std::array<byte,4>& 替代。 - user0042
2
使用 hello(&stuff),你可以传递一个指向 hello 的指针,此外,你应该使用 std::arraystd::vector 或任何其他 std 容器来代替 byte stuff[4] - t.niese
1
使用std::vector或std::array的好处或动机是什么? - Peter Savnik
3
如果说有什么不好的话,原始数组有一种讨厌的倾向,就是会衰变成指向它们第一个元素的指针。使用std::array可以避免这种情况。而且,我认为,与原始数组相比,如果将std::array作为参数传递给函数时,通过值、指针或引用进行传递更加清晰明了。还有很多其他原因,但这两个已经足够让我在几乎所有情况下都更喜欢std::array而不是原始数组了。 - Borgleader
使用std容器的好处在于它们会处理与容器相关的内存管理。这使得您更容易阅读代码中容器的传递方式以及存储的数据类型。此外,您还可以受益于std库提供的所有方法和实用函数。 - t.niese
3个回答

9
这里有许多不同的选项,具体取决于你想在这里做什么。
如果您有一个原始的 byte 对象数组,可以将其传递到以下函数中:
void hello(byte arr[]) {
   // Do something with arr
}

int main() {
   byte arr[4];
   hello(arr);
}

数组传递给函数的机制(将指向数组第一个元素的指针传递给函数)类似于按引用传递:在hello中对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是一个具有常规对象类型所有优点的对象类型。我建议优先选择这种方法。

3

数组已经通过指针传递。

因此,这个:

int a(int array[]) {
}

这与以下操作相同:
int a(int * array) {
}

做这个:

void hello(byte (&a)[4])

只允许传递长度为4的数组。


1
这不是“按引用传递”的意思。 - molbdnilo
2
小心 - “按引用传递”有特定的含义。如果你将一个数组传递到一个函数中,实际上是通过值传递一个指向数组第一个元素的指针到函数中。 - templatetypedef

2

byte* a[4] 是一个指向 byte 的四个指针数组,但在参数列表中有所不同。
在参数列表中,它是一个指向指向 byte 的指针 - 即等价于 byte**

byte (*a)[4] 是一个指向四元素数组的指针。

byte (&a)[4] 是一个四元素数组的引用。

在您的情况下,&stuff 是一个指向四元素数组的指针,因此您的参数应该是 byte (*a)[4]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接