C++ 通过引用传递数组
如何通过引用传递静态分配的数组C++ 通过引用传递数组,c++,arrays,C++,Arrays,如何通过引用传递静态分配的数组 void foo(int (&myArray)[100]) { } int main() { int a[100]; foo(a); } (&myArray)[100]是否有任何意义,或者只是通过引用传递任何数组的语法? 我不明白这里的括号后面是大括号。谢谢。这是数组引用的语法-您需要使用(&array)向编译器说明您想要数组引用,而不是引用的(无效)数组int&array[100] 编辑:一些澄清 void foo(int * x);
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
(&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
这被解析为“引用数组”——这是不合法的 这只是所需的语法:
void Func(int (&myArray)[100])
^通过引用传递100的数组int
,参数名称为myArray
void Func(int* myArray)
^传递一个数组。数组衰减为指针。因此,您将丢失大小信息
void Func(int (*myFunc)(double))
^传递函数指针。该函数返回一个int
,并取一个double
。参数名为myFunc
这是一种语法。在函数参数int(&myArray)[100]
中,必须用括号括住&myArray
。如果不使用它们,您将传递一个引用的数组
,这是因为下标运算符[]
的优先级高于&运算符
例如,int&myArray[100]//引用数组
因此,通过使用type-construction()
可以告诉编译器您需要一个对100个整数数组的引用
例如int(&myArray)[100]//100 int数组的引用是指针默认传递的。您可以尝试修改函数调用中的数组,以便更好地理解。下面创建了一个泛型函数,通过引用获取任意大小和任意类型的数组:
template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
// do stuff
}
模板
作废我的职能(T&arr)[S]){
//做事
}
函数参数是否存在右值对左值的关系?不能通过值传递可能重复的数组。如果函数接收到指针,数组将衰减为指向其第一个元素的指针。我不知道你想说什么。@UlrichEckhardt我想说的是“数组不能按值传递”,正如你之前所说的,它们是默认的按引用传递数组既不能按值传递也不能按引用传递。它们通过指针传递。如果默认情况下数组是通过引用传递的,那么在数组上使用sizeof不会有问题。但事实并非如此。数组在传递到函数时衰减为指针。数组可以通过引用或降级为指针进行传递。例如,使用char-arr[1];foo(char-arr[])。
,arr退化为指针;使用char-arr[1]时;foo(char&arr)[1])
,arr作为引用传递。值得注意的是,由于维度丢失,前一种形式通常被视为格式不正确。Re,“数组……通过指针传递。”这种描述听起来很不传统,可能会让新手感到困惑。数组变量的名称是一个有效表达式,其值是数组第一个成员的指针。如果您有一些函数foo(T*T)
,并且您有一个数组ta[N]代码>然后当你写foo(a)代码>我认为更正确的说法是,你传递的是指针,而不是数组,你是按值传递指针;int arr[3]={a,b,c}代码>?啊哈,发现了。有人能解释一下为什么voidfoo(int&x[100])代码>被解析为“引用数组”吗?是因为“从右到左”规则吗?如果是,它似乎与void foo(int&x)[100]的方式不一致代码>被解析为“对数组的引用”。提前感谢。它不是从右到左,而是从内到外,[]绑定比&“如果不使用它们,您将传递一个引用的数组”
“-当然,这是不存在的,因此您将得到一个编译错误。有趣的是,运算符优先级规则坚持这在默认情况下必须发生。是否还有关于类型构造()的教程?谢谢,我需要一个解释,其中包括运算符优先级的原因,这就解释了为什么应该这样做。我们如何传递一个可变大小的数组作为引用?@ShivamArora您将函数模板化,并将大小作为模板参数。。