C ++将对数组的引用传递给函数

时间:2017-07-20 17:02:04

标签: c++ arrays reference

给函数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}
}

或者我看到其他人使用这种形式的decaration:

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

这是正确的方法吗?

3 个答案:

答案 0 :(得分:5)

这里有许多不同的选项,具体取决于你想在这里做什么。

如果你有一个byte个对象的原始数组,你可以把它传递给这样的函数:

void hello(byte arr[]) {
   // Do something with arr
}

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

将数组传递给函数的机制(指向数组的第一个元素的指针传递给函数)的功能类似于传递引用:您对arr所做的任何更改hello即使你没有明确传入对它的引用,也会坚持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是一种具有常规对象类型的所有优点的对象类型。我建议采用最后一种方法优先于其他方法。

答案 1 :(得分:0)

数组已经通过指针传递。

所以这个:

int a(int array[]) {
}

与此相同:

int a(int * array) {
}

这样做:

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

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

答案 2 :(得分:0)

byte* a[4]是一个包含byte四个指针的数组,但参数列表除外 在参数列表中,它是指向byte的指针的指针 - 即它等同于byte**

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

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

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