通过引用传递对象数组 阿纳尔的数组,如 MySype XYZ(123);< /Cord> >,然后你做了一些错误的事情,因为函数内的值更改应该是永久的。(仅复制指针地址)。它是固定大小的数组还是动态大小的数组?也许这会有助于显示您的代码。关于您“无法找到有关如何将对象数组作为引用传递的说明”的说法,你一定是做错了什么:@Anton Raskin,你能展示一段代码片段来演示这个问题吗?从你的帖子中,你不清楚你有什么问题。你不能向函数声明一个非引用数组参数。声明指针的方法有很多种,可能会让你误以为它是数组。@UlrichEckhardt,我想不是他回答得很清楚(“declar[ing]数组……与……指针相同”)但是,你可以让参数成为数组的引用。C++有语法。我同意使用 STD::数组< /Cord>,但是如果你有一个固定大小的数组,它不一定是通过引用传递的,这样你就有了可用的大小,可以使用标准的库算法。值得一提的是,@ ChrisDrew如果你把一个C样式数组传递给一个函数,它就被分解成一个没有任何大小信息的指针,即使你声明的参数大小类似于数组,大小也被丢弃,你所拥有的仍然是指针。如果函数参数是指针,那么在C++中。将一个C样式的数组传递给一个引用数组参数的函数,那么显然就不会有指针衰减。 #include <iostream> void ModifyArray(int* array) { array[4] = 0; // problem! } int main() { int array[3] = { 1, 2, 3 }; ModifyArray(array); }

通过引用传递对象数组 阿纳尔的数组,如 MySype XYZ(123);< /Cord> >,然后你做了一些错误的事情,因为函数内的值更改应该是永久的。(仅复制指针地址)。它是固定大小的数组还是动态大小的数组?也许这会有助于显示您的代码。关于您“无法找到有关如何将对象数组作为引用传递的说明”的说法,你一定是做错了什么:@Anton Raskin,你能展示一段代码片段来演示这个问题吗?从你的帖子中,你不清楚你有什么问题。你不能向函数声明一个非引用数组参数。声明指针的方法有很多种,可能会让你误以为它是数组。@UlrichEckhardt,我想不是他回答得很清楚(“declar[ing]数组……与……指针相同”)但是,你可以让参数成为数组的引用。C++有语法。我同意使用 STD::数组< /Cord>,但是如果你有一个固定大小的数组,它不一定是通过引用传递的,这样你就有了可用的大小,可以使用标准的库算法。值得一提的是,@ ChrisDrew如果你把一个C样式数组传递给一个函数,它就被分解成一个没有任何大小信息的指针,即使你声明的参数大小类似于数组,大小也被丢弃,你所拥有的仍然是指针。如果函数参数是指针,那么在C++中。将一个C样式的数组传递给一个引用数组参数的函数,那么显然就不会有指针衰减。 #include <iostream> void ModifyArray(int* array) { array[4] = 0; // problem! } int main() { int array[3] = { 1, 2, 3 }; ModifyArray(array); },c++,C++,如果您有一个实际数组,例如 MyClass array[X]; MyClass* array = new MyClass[X]; 然后当你把它传递给一个函数时,它会衰减到一个指针,所以在某种程度上它已经通过引用传递了。函数像数组一样声明参数并不重要,它仍然是一个指针 因此,以下两个函数声明是等效的: void my_function(MyClass array[X]); 及 如果您有一个动态分配的数组,例如 MyClass array[X]; MyClass* array = new

如果您有一个实际数组,例如

MyClass array[X];
MyClass* array = new MyClass[X];
然后当你把它传递给一个函数时,它会衰减到一个指针,所以在某种程度上它已经通过引用传递了。函数像数组一样声明参数并不重要,它仍然是一个指针

因此,以下两个函数声明是等效的:

void my_function(MyClass array[X]);


如果您有一个动态分配的数组,例如

MyClass array[X];
MyClass* array = new MyClass[X];
那么
array
已经是一个指针,不需要通过引用传递,除非您想修改实际的指针


如果您有一个类型为或的对象(我建议不要使用指针或普通数组),那么您可以使用普通的符号和
&
通过引用传递它。

通过引用传递数组通常是不必要的。当您向函数声明数组参数时,它与将参数声明为指针相同,因此您仍然具有一定的间接性

当传递对象(如
std::vector
std::array
)时,可以像传递任何旧参数一样,通过在参数名称前放置
&
来通过引用传递该对象

下面是一个通过引用将向量传递给函数并观察调用者所包含的值已更改的示例:

#include <vector>
#include <iostream>

void double_all(std::vector<int>& values) {
  for (int& v: values)
    v += v;
}

int main() {
  std::vector<int> values = {0, 1, 2, 3, 4};
  double_all(values);
  for (int v: values)
    std::cout << v << "\n";
}
#包括
#包括
void double_all(标准::向量和值){
用于(int&v:值)
v+=v;
}
int main(){
向量值={0,1,2,3,4};
双_all(值);
for(int v:值)

std::cout您可以通过引用传递原始数组,即使语法有点难看:

#include <iostream>

void ModifyArray(int (&array)[5])
{
    array[4] = 0;
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    ModifyArray(array);

    std::cout << array[4] << "\n";
}
如果您试图“直接”传递原始数组,那么您实际上是在传递指向数组第一个元素的指针。这被非正式地称为“衰减”。以下方法显然有效,但需要注意:

#include <iostream>

void ModifyArray(int array[5]) // works?
{
    array[4] = 0;
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    ModifyArray(array);

    std::cout << array[4] << "\n";
}
此程序编译得很好,但会调用未定义行为,因为您试图访问3元素数组的第5个元素。它与此没有区别:

#include <iostream>

void ModifyArray(int* array)
{
    array[4] = 0; // problem!
}

int main()
{
    int array[3] = { 1, 2, 3 };

    ModifyArray(array);
}
#包括
void ModifyArray(int*array)
{
数组[4]=0;//问题!
}
int main()
{
int数组[3]={1,2,3};
修改数组(数组);
}


当你通过元素集合时,总是使用<代码> STD::<代码> STD::数组默认情况下,如果你真的需要它们,考虑其他选项。< /P>阿纳尔的数组,如<代码> MySype XYZ(123);< /Cord> >,然后你做了一些错误的事情,因为函数内的值更改应该是永久的。(仅复制指针地址)。它是固定大小的数组还是动态大小的数组?也许这会有助于显示您的代码。关于您“无法找到有关如何将对象数组作为引用传递的说明”的说法,你一定是做错了什么:@Anton Raskin,你能展示一段代码片段来演示这个问题吗?从你的帖子中,你不清楚你有什么问题。你不能向函数声明一个非引用数组参数。声明指针的方法有很多种,可能会让你误以为它是数组。@UlrichEckhardt,我想不是他回答得很清楚(“declar[ing]数组……与……指针相同”)但是,你可以让参数成为数组的引用。C++有语法。我同意使用<代码> STD::数组< /Cord>,但是如果你有一个固定大小的数组,它不一定是通过引用传递的,这样你就有了可用的大小,可以使用标准的库算法。值得一提的是,@ ChrisDrew如果你把一个C样式数组传递给一个函数,它就被分解成一个没有任何大小信息的指针,即使你声明的参数大小类似于数组,大小也被丢弃,你所拥有的仍然是指针。如果函数参数是指针,那么在C++中。将一个C样式的数组传递给一个引用数组参数的函数,那么显然就不会有指针衰减。

#include <iostream>

void ModifyArray(int* array)
{
    array[4] = 0; // problem!
}

int main()
{
    int array[3] = { 1, 2, 3 };

    ModifyArray(array);
}