C++通过引用传递数组

4

这是可能的重复问题:
什么是引用到数组参数的好处?

是否

void myFunction( int (&arg)[4] );

并且

void myfunction(int arg[4]);

两者有什么不同?它们各自的功能是什么,我该如何调用第一个?

1
请使用vector代替。更好的选择是使用vector::iterator - John Dibling
1个回答

7

它们是不同的。第一种需要一个包含4个整数的数组的引用作为参数。第二种需要一个指向未知数量整数的数组中第一个元素的指针作为参数。

int array1[4] = {0};
int array2[20] = {0};

void myFunction1( int (&arg)[4] );
void myFunction2( int arg[4] );

myFunction1( array1 ); // ok
myFunction1( array2 ); // error, size of argument array is not 4

myFunction2( array1 ); // ok
myFunction2( array2 ); // ok

为什么是未知数量的整数?难道括号中不应该是4吗? - Chin
3
在函数签名中,根据标准,类型为T的N个元素的数组指针会被转换为T类型的指针。如果类型是数组引用,则不会发生这种情况。原因是在C语言中(C++从中继承了这种行为),无法通过值传递数组,因为这可能是一项昂贵的操作。因此,当您使用语法按值传递数组时,函数将采用指针,并且在调用站点中,该数组将退化为指向第一个元素的指针。 - David Rodríguez - dribeas
2
函数参数中的数组的第一维总是被丢弃的。因此,有4也没有任何区别。 - Praetorian
1
@Chin 不确定你所说的“按值传递”是什么意思。在两种情况下,函数都不会得到数组的副本。在第一种情况下,它是对数组的引用(保留大小信息),在函数中修改数组也会在调用者的上下文中进行修改。同样,在第二种情况下,它是指向第一个元素的指针,您可以使用该指针对数组进行修改。 - Praetorian
1
@Chin 首先,由于原始数组存在其他问题,您应该尽量避免使用它们。在C++中,如果您需要一个静态大小的数组,只需使用std::array。如果您需要一个动态大小的数组,请使用std::vector或其他容器(或迭代器)。如果您必须出于某种原因使用原始数组,则尽可能使用引用(或其他保留完整类型信息的类型),因为它提供更好的类型检查。仅在最后一种情况下使用衰减数组。 - bames53
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接