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