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

新手上路,请多包涵

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

这是正确的方法吗?

原文由 Peter Savnik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

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

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

原文由 templatetypedef 发布,翻译遵循 CC BY-SA 3.0 许可协议

数组已经通过指针传递。

所以这:

 int a(int array[]) {
}

和这样做是一样的:

 int a(int * array) {
}

这样做:

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

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

原文由 Cpp plus 1 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题