[英]Different syntax of passing an array to a function in C++
#include <stdio.h>
void test2(int (&some_array)[3]){
// passing a specific sized array by reference? with 3 pointers?
}
void test3(int (*some_array)[3]){
// is this passing an array of pointers?
}
void test1(int (some_array)[3]){
// I guess this is the same as `void test1(some_array){}`, 3 is pointless.
}
int main(){
//
return 0;
}
以上3种语法有什么区别? 我在每个部分都添加了评论,以使我的问题更加具体。
void test2(int (&some_array)[3])
这是传递对 3 个int
数组的引用,例如:
void test2(int (&some_array)[3]) {
...
}
int arr1[3];
test2(arr1); // OK!
int arr2[4];
test2(arr2); // ERROR!
void test3(int (*some_array)[3])
这是将指针传递给 3 个int
的数组,例如:
void test3(int (*some_array)[3]) {
...
}
int arr1[3];
test3(&arr1); // OK!
int arr2[4];
test3(&arr2); // ERROR!
void test1(int (some_array)[3])
现在,这就是事情变得有点有趣的地方。
在这种情况下括号是可选的(在引用/指针情况下它们不是可选的),所以这等于
void test1(int some_array[10])
这反过来只是语法糖
void test1(int some_array[])
(是的,数字被忽略)
这反过来只是语法糖
void test1(int *some_array)
因此,不仅数字被忽略,而且它只是一个简单的传入指针。任何固定数组都会衰减为指向其第一个元素的指针,这意味着可以传入任何数组,即使声明仅建议允许使用 3 个元素,例如:
void test1(int (some_array)[3]) {
...
}
int arr1[3];
test1(arr1); // OK!
int arr2[10];
test1(arr2); // ALSO OK!
int *arr3 = new int[5];
test1(arr3); // ALSO OK!
delete[] arr3;
在您的代码中, test3
是传递指向数组的指针的正确方法,如果这是您想要的。
void foo(int (*some_array)[3])
{
for (size_t i = 0; i < 3; ++i) {
printf("some_array[%zu]: %d\n", i, (*some_array)[i]);
}
}
int main()
{
int a[3] = { 4, 5, 6 };
foo(&a);
return 0;
}
运行此代码会返回您期望的结果:
some_array[0]: 4
some_array[1]: 5
some_array[2]: 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.