将bool数组传递给函数

时间:2013-08-31 17:26:25

标签: c++ arrays pass-by-reference pass-by-value

我传递一个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];
}

2 个答案:

答案 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运算符。

见这里:

Why can't arrays be passed as function arguments?

答案 1 :(得分:0)

将数组传递给函数时,实际上是将指针传递给第一个元素。这就是为什么您对函数中的数组所做的更改会反映在原始数组中。您不能按值传递数组。这是因为:

  

复制数组会有点复杂,不太清楚,因为   对于不同的参数和不同的行为将会改变   功能声明。

Why can't we pass arrays to function by value?