通过引用传递数组并修改值 C++
Pass array by reference and modify values C++
我想编写一个函数,它接受 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};
包含错字,将不会被编译。必须至少有like
int inArray[4] = {1,2,3,4};
或
int inArray[] = {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
第一个显然是最简单的
第二个是等效的,因为当调用者传递数组参数时,它们被允许衰减为指针,即使对于 1) 也会发生这种情况,因为数组维度只能在接受时被捕获或强制执行通过引用数组,如以下情况...
第三个额外确保数组参数恰好有 4 个元素(所以突然间你不能(轻松地)传递一个包含 10 个元素的数组并让它只复制前 4 个元素)。
第四个接受任何大小的数组,但如果在不同大小的数组上使用不同的调用代码,它可能会创建 myFunction
代码的多个副本,可能会使用更多的内存来获得更大的数组程序。
由于您将元素 [0]
到 [3]
上的函数体硬编码操作,它不会调整以在更大的数组中进一步对元素执行操作,但您可以选择使用N
函数体内的值,用于计算要操作的元素数量。
我想编写一个函数,它接受 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};
包含错字,将不会被编译。必须至少有like
int inArray[4] = {1,2,3,4};
或
int inArray[] = {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
第一个显然是最简单的
第二个是等效的,因为当调用者传递数组参数时,它们被允许衰减为指针,即使对于 1) 也会发生这种情况,因为数组维度只能在接受时被捕获或强制执行通过引用数组,如以下情况...
第三个额外确保数组参数恰好有 4 个元素(所以突然间你不能(轻松地)传递一个包含 10 个元素的数组并让它只复制前 4 个元素)。
第四个接受任何大小的数组,但如果在不同大小的数组上使用不同的调用代码,它可能会创建
myFunction
代码的多个副本,可能会使用更多的内存来获得更大的数组程序。
由于您将元素 [0]
到 [3]
上的函数体硬编码操作,它不会调整以在更大的数组中进一步对元素执行操作,但您可以选择使用N
函数体内的值,用于计算要操作的元素数量。