Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传递数组_C++_Arrays - Fatal编程技术网

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您将函数模板化,并将大小作为模板参数。。