C/C++:将带有成员数组的结构/class按值传递给函数

C / C++ : passing a struct / class with a member array to a function by value

struct A{
  int V[100];
};


void f(A a)
{

  a.V[0]=30;
}

int main()
{
  A a;
  a.V[0]=10;
  f(a);
  cout<<a.V[0];
}

我期望 30 作为输出,但我得到了 10。我知道,如果参数是按值传递的,数组(也是 class/struct 的成员)也是按引用传递的。相反,当成员时,它们似乎是通过副本传递的。 是真的吗?

你把变量a传值,在函数f中把内容改成30。由于您没有 return 它返回并且没有通过引用将它传递给函数,因此您对 a 的更改不会影响主函数中 a 的值。这就是为什么你得到 10 而不是 30 的原因。 这可能是您想要的:

void f(A &a)
{
  a.V[0]=30;
}

按值将数组作为参数传递给函数会导致它衰减为指向第一个元素的指针,这就像按引用传递一样。

将对象包含数组(不是指针)按值传递给函数会导致该对象(包括数组)被复制到函数的参数中。

如果您想在调用站点看到该修改,请通过非常量引用传递。

实际上,您正在将一个类型为 struct A 的对象传递给该函数,因此将创建一个空洞新对象,其中包括您的数组 class。所以你不会得到 30,因为 result.you 被 Array 成员误导,如果你只将一个数组传递给函数,值肯定会改变,但在你的情况下你使用结构来包装你的数组。 作为解决方法,您应该在 A 结构上使用引用或指针作为函数参数。

I knew that, also if the parameters are passed by value, arrays (also if members of class/struct) are passed by reference.

但这是不正确的

你把事情弄糊涂了。

数组的 name 当直接用作函数参数时,会衰减为指向该数组 [第一个元素] 的指针。这并不意味着任何数组,无论在封装对象中嵌套多远,都会神奇地从一个值变为 "reference".

事实上,您展示的代码是解决这一历史性数组名称衰减惨败并获得数组完整值语义的典型方法,例如std::array<T, N>就是这样。

C 只有值传递。这对所有类型都以相同的方式工作。

你很困惑,因为 "arrays" 在 C 中实际上不能是 "passed" -- 在任何函数都不能有数组类型参数的意义上。 C 标准规定,如果您尝试编写 array-of-T 类型的参数,编译器会将其视为您编写指向-T 类型的指针。所以,不可能有数组类型的参数。当您传递一个数组类型的表达式时,编译器发现该参数需要一个指针类型,它会在按值传递之前将数组隐式转换为指向其第一个元素的指针。

另一方面,可以有一个结构类型的参数。