[英]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.我知道,如果参数是通过值传递的,数组(也可以是类/结构的成员)通过引用传递。 相反,当成员,他们通过副本传递。 是真的?
您通过值传递变量a
并在函数f
中将内容更改为30。 由于您没有将其返回并且未通过引用将其传递给函数,因此对a
的更改不会影响main函数中a
的值。 这就是你得到10而不是30的原因。这可能是你想要的:
void f(A &a)
{
a.V[0]=30;
}
通过值将数组传递给函数作为参数会导致它衰减为指向第一个元素的指针,因此就像通过引用传递一样。
通过值将包含数组(不是指针)的对象传递给函数会导致该对象(包括数组)被复制到函数的参数中。
如果要在调用站点上看到该修改,请通过非const引用。
我知道,如果参数是通过值传递的,那么数组(也就是类/结构的成员)是通过引用传递的。
除了这不是真的 。
你是混乱的事情。
当直接用作函数参数时,数组的名称会衰减到指向该数组的[第一个元素]的指针。 这并不意味着任何数组,无论嵌套在封装对象中多远,都会从一个值神奇地变为“引用”。
实际上,您展示的代码是解决此历史数组名称衰减惨败的典型方法,并获得数组的完整值语义,例如std::array<T, N>
就是这样。
实际上,您正在将一个struct A类型的对象传递给该函数,因此将创建一个新的对象,包括您所在类中的Array。 所以你不会得到30结果。你被Array成员误导,如果你只传递一个数组到函数值肯定会被改变,但在你的情况下你使用结构来包装你的数组。 作为一种解决方法,您应该使用A结构上的引用或指针作为函数参数。
C只有传值。 对于所有类型,这都是相同的。
你很困惑,因为“数组”实际上不能在C中“传递” - 在某种意义上,没有函数可以有一个数组类型的参数。 C标准指定如果您尝试编写array-of- T
类型的参数,编译器会将其视为您编写指向T
类型的指针。 因此,不可能有阵列类型的参数。 当您传递数组类型的表达式,并且编译器发现该参数需要指针类型时,它将隐式地将数组转换为指向其第一个元素的指针,然后再按值传递。
另一方面,可以具有struct类型的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.