C++ 传递对数组的引用以使其发挥作用
C++ Pass a reference to an array to function
给定于函数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]
。
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 在 C++ 中通过引用传递类成员时,Const 不起作用
- 将数组作为引用传递到函数中不起作用
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- C++ 传递对数组的引用以使其发挥作用
- 对列表迭代器指向的对象不起作用的引用
- 我的模板功能具有通用引用不起作用
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 取消引用引用不起作用
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- Visual Studio 2017 对项目的本机引用不起作用
- 为什么在这种情况下转发引用不起作用?
- 为什么 [ ] 括号在取消引用指针时不起作用?
- 为什么这不起作用?(引用的大括号初始化)
- 在文档中引用使用doxygen的结构成员不起作用;结构成员未出现在文档中
- 使用引用遍历链接列表不起作用
- 为什么将指针转换为引用在我的访问器 (getter) 中不起作用?
- 链接相互引用的排序类。转发不起作用