C++ 传递对数组的引用以使其发挥作用

C++ Pass a reference to an array to function

本文关键字:作用 引用 数组 C++      更新时间:2023-10-16

给定于函数void main((和void hello(byte* a[4](。Main 函数有一个四个字节的数组。数组的引用需要传递给函数 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])

这是正确的方法吗?

这里有许多不同的选项,具体取决于您要在此处执行的操作。

如果你有一个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是一种具有常规对象类型所有优点的对象类型。我建议使用最后一种方法,而不是所有其他方法。

数组已经通过指针传递。

所以这个:

int a(int array[]) {
}

与执行此操作相同:

int a(int * array) {
}

这样做:

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

仅允许传入长度为 4 的数组。

byte* a[4]是一个由四个指向byte的指针组成的数组,除了在参数列表中。
在参数列表中,它是指向byte的指针 – 即它等效于byte**

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

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

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