如何通过引用来传递静态分配的数组?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
< p > (&myArray)[100]
是否有意义或者只是传递任何数组的引用的语法?
我不理解这里分开的括号,然后跟着大括号。谢谢。这是用于数组引用的语法 - 您需要使用 (&array)
来向编译器说明您想要一个数组的引用,而不是无效的引用数组 int & array[100];
。
编辑:有些澄清。
void foo(int * x);
void foo(int x[100]);
void foo(int x[]);
这三种声明方式表示的是同一个函数。它们都被视为接受一个 int *
参数,所以你可以将任何大小的数组传递给它们。
void foo(int (&x)[100]);
这仅接受包含100个整数的数组。您可以安全地在x
上使用sizeof
。
void foo(int & x[100]); // error
这被解析为“引用数组”,这是不合法的。
int a,b,c; int arr[3]={a,b,c};
? - Voracvoid foo(int & x[100]);
被解析为“引用数组”吗?这是因为“由右至左”的规则吗?如果是的话,似乎与void foo(int (&x)[100]);
被解析为“指向数组的引用”不一致。先谢谢了。 - zl9394这只是必需的语法:
void Func(int (&myArray)[100])
传递一个名为myArray
的参数作为引用,其中包含100个int
的数组;
void Func(int* myArray)
传递一个数组。数组会退化为指针。因此您失去了大小信息。
void Func(int (*myFunc)(double))
传递一个函数指针,该函数返回一个 int
类型的值,并接受一个 double
参数。该参数名为 myFunc
。
这是一种语法结构。在函数参数int(&myArray)[100]
中,括号包含&myArray
是必要的。如果不使用它们,则会传递一个引用数组
,这是因为下标运算符[]
比&运算符
的优先级更高。
例如:int &myArray[100] // 引用数组
因此,通过使用类型构造()
告诉编译器您想要一个引用到100个整数的数组。
例如:int (&myArray)[100] // 100个int数组的引用
template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
// do stuff
}
数组默认通过指针传递。您可以尝试在函数调用中修改数组以便更好地理解。
char arr[1]; foo(char arr[])
时,arr会退化为指针;而使用char arr[1]; foo(char (&arr)[1])
时,arr作为引用被传递。值得注意的是,前一种形式通常被认为是不良形式,因为维度丢失了。 - zl9394foo(T* t)
,并且您有一个数组T a[N];
,那么当您写foo(a);
时,我认为更正确的说法是您正在传递一个指针,而不是传递一个数组,并且您正在通过值传递指针。 - Solomon Slow