C++ 通过引用传递数组并修改值C++;

C++ 通过引用传递数组并修改值C++;,c++,arrays,pass-by-reference,C++,Arrays,Pass By Reference,我想写一个函数,它接受inArray[3]={1,2,3,4}和outArray[3],并在函数中修改outArray[3],现在包含值={3,4,1,2} int main{ int inArray[4] = {1,2,3,4}; int outArray[4]; myFunction(&inArray, &outArray); } void myFunction(&inArray, &outArray){ outArray[0] = inArra

我想写一个函数,它接受
inArray[3]={1,2,3,4}
outArray[3]
,并在函数中修改
outArray[3]
,现在包含值={3,4,1,2}

int main{
 int inArray[4] = {1,2,3,4};
 int outArray[4];

 myFunction(&inArray, &outArray);
}

void myFunction(&inArray, &outArray){
  outArray[0] = inArray[2];
  outArray[1] = inArray[3];
  outArray[2] = inArray[0];
  outArray[3] = inArray[1];
}

我在这里做错了什么,我不知道如何通过引用传递数组并操作函数中的值。

函数及其调用可以如下所示

const size_t N = 4;

void myFunction( int ( &inArray )[N], int ( &outArray )[N] )
{
  outArray[0] = inArray[2];
  outArray[1] = inArray[3];
  outArray[2] = inArray[0];
  outArray[3] = inArray[1];
}

int main()
{
 int inArray[N] = {1,2,3,4};
 int outArray[N];

 myFunction( inArray, outArray );
}
考虑到您对数组的定义

int inArray[3] = {1,2,3,4};
包含输入错误,将不会被编译。至少应该有类似的

int inArray[4] = {1,2,3,4};


数组始终按引用传递,无需手动按引用传递。

数组的大小为3,但您尝试在其中存储4个元素,并访问位于
[3]
的第四个元素(其行为未定义)

使它们变大,或者硬编码4,或者使所有内容自动调整到用于初始化inArray的数字列表的当前长度:

int inArray[] = {1,2,3,4};  // automatically sized
int outArray[sizeof inArray / sizeof *inArray];
然后,函数签名应该指定参数的-
int
数组。有很多方法可以做到这一点:

void myFunction(const int inArray[], int outArray[])         // 1
void myFunction(const int* inArray, int* outArray)           // 2
void myFunction(const int (&inArray)[4], int (&outArray)[4]) // 3
template <size_t N>
void myFunction(const int (&inArray)[N], int (&outArray)[N]) // 4
void myFunction(const int inArray[],int outArray[])/1
void myFunction(const int*inArray,int*outArray)//2
void myFunction(const int(&inArray)[4],int(&outArray)[4])//3
模板
void myFunction(常量int(&inArray)[N],int(&outArray)[N])//4
  • 第一个显然是最简单的

  • 第二个是等效的,当调用方传递数组参数时,它们被允许衰减到指针,甚至对于1)也会发生这种情况,因为只有在通过引用接受数组时,才能捕获或强制执行数组维度,如下例所示

  • 第三种方法还确保数组参数正好有4个元素(因此,突然之间,您无法(轻松地)传递一个包含10个元素的数组,并让它仅复制前4个元素)

  • 第四个可以接受任意大小的数组,但如果在不同大小的数组上从不同的调用代码使用,它可能会创建
    myFunction
    代码的多个副本,可能会为更大的程序使用更多的内存


当您将函数体硬编码对元素的操作
[0]
[3]
时,它不会调整为对更大数组中的元素执行操作,但您可以选择使用函数体中的
N
值来计算要操作的元素数。

非常感谢!在你发布之前我已经更正了错误,如果现在看起来有点奇怪,我会道歉。将在5分钟内接受答案。但通过引用传递它们需要OP不知道的语法,否则他们不会询问。
void myFunction(const int inArray[], int outArray[])         // 1
void myFunction(const int* inArray, int* outArray)           // 2
void myFunction(const int (&inArray)[4], int (&outArray)[4]) // 3
template <size_t N>
void myFunction(const int (&inArray)[N], int (&outArray)[N]) // 4