我想写一个带inArray[3] = {1,2,3,4}
和outArray[3]
的函数,并在函数中修改outArray[3]
,现在包含values = {3,4,1,2}。< / p>
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];
}
我在这里做错了,我并没有准确地理解如何通过引用传递数组并操纵函数内部的值。
答案 0 :(得分:3)
该功能及其调用可以采用以下方式
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};
或
int inArray[] = {1,2,3,4};
答案 1 :(得分:2)
您的数组大小为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
第一个显然是最简单的。
第二个是等价的,因为当调用者传递数组参数时,它们被允许衰减为指针,甚至1)也会发生这种情况,因为只有在通过引用接受数组时才能捕获或强制执行数组维,如下列情况......
第三个另外确保数组参数恰好有4个元素(所以突然你不能(轻松)传递10个元素的数组并且只复制前4个元素。
< / LI>第四个接受任何大小的数组,但如果在不同大小的数组上使用不同的调用代码,它可能会创建myFunction
代码的多个副本,可能会为更大的程序使用更多内存。
由于您在元素[0]
到[3]
上执行了函数体硬编码操作,因此不会调整元素以进一步处理大型数组,但您可以选择使用{{ 1}}函数体内部的值,用于计算要操作的元素数量。
答案 2 :(得分:0)
数组总是通过引用传递,无需通过引用手动传递它。