3

我将一个布尔数组传递给函数并在函数内部对传递的数组进行一些修改,我在函数中所做的更改反映在我传递给函数的原始数组中。例如,在输出下方的代码中是。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];
}
4

2 回答 2

3

为什么我得到这个输出?

当“按值”传递数组时,数组本身不会被复制,只有指向其地址的指针的副本被传递给被调用者(放置在堆栈上)。无论您是否将参数声明为bool[]or 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 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则“类型数组”类型的表达式将转换为“类型指针”类型的表达式指向数组对象的初始元素,不是左值。如果数组对象具有寄存器存储类,则行为未定义。

C11 标准中的相同段落本质上是相同的,只是增加了新的_Alignof运算符。

看这里:

为什么数组不能作为函数参数传递?

于 2013-08-31T17:34:43.397 回答
0

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

复制数组会有点复杂而且不是很清楚,因为行为会因不同的参数和不同的函数声明而改变。

为什么我们不能通过值传递数组来函数?

于 2013-08-31T17:33:37.390 回答