我传递一个bool数组来函数并在函数内部传递的数组中进行一些修改,我在函数中所做的更改反映在我传递给函数的原始数组中。例如,在代码中输出下方是1
。为什么我得到这个输出?例如,当我们传递一个整数变量时,局部变量会保持其本地值。如何在本地代码中保留原始bool数组的本地副本。
#include<iostream>
using namespace std;
void fun(bool A[30])
{
A[0]=true;
}
int main()
{
bool used[3];
used[0]=used[1]=used[2]=0;
fun(used);
cout<<used[0];
}
答案 0 :(得分:2)
为什么我得到这个输出?
当按“值”传递数组时,数组本身没有被复制,只有指向其地址的指针的副本被传递给被调用者(放在堆栈上)。无论您将参数声明为bool[]
还是bool*
,都会将参数声明为指针。因此,您仍然可以在被调用函数中修改数组的内容。
如何在本地保留原始bool数组的本地副本?
您可以使用std::array
或者您可以通过将数组包装在结构或类中来解决此问题,因为默认的复制运算符将复制数组:
struct Array_by_val
{
bool my_array[30];
};
void func (Array_by_val x) {}
int main() {
Array_by_val x;
func(x);
}
引用C99标准中的6.3.2.1p3:
除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有“数组类型”类型的表达式将转换为表达式 类型为“指向类型的指针”,指向的初始元素 数组对象并不是左值。如果数组对象已注册 存储类,行为未定义。
C11标准中的相同段落基本相同,添加了新的_Alignof
运算符。
见这里:
答案 1 :(得分:0)
将数组传递给函数时,实际上是将指针传递给第一个元素。这就是为什么您对函数中的数组所做的更改会反映在原始数组中。您不能按值传递数组。这是因为:
复制数组会有点复杂,不太清楚,因为 对于不同的参数和不同的行为将会改变 功能声明。