繁体   English   中英

在C ++中通过引用传递一组结构

[英]Passing an array of structs by reference in C++

所以我仍然是编程/ C ++的新手,并且仍然试图绕过指针并通过引用和所有内容传递。 我想弄清楚的一个程序现在需要将一个结构数组传递给另一个函数。 我已经通过直接传递数组来实现它。 它似乎工作正常。 但是,我关心的是我相信我是按值传递它的,并且我理解通过引用传递结构更好,所以你不是每次都复制结构...

无论如何,这是我正在做的一个基本的例子:

struct GoldenHelmet {
    int foo;
    string bar;
    };

void pass (GoldenHelmet ofMambrino[], int size);

int main () {
    GoldenHelmet ofMambrino[10];
    int size = sizeof(ofMambrino) / sizeof(ofMambrino[0]);
    ofMambrino[1].foo = 1;
    pass(ofMambrino, size);
    cout << ofMambrino[2].foo << endl;
    return 0;
}

void pass (GoldenHelmet ofMambrino[], int size) {
    ofMambrino[2].foo = 100;
    ofMambrino[2].bar = "Blargh";
}

根据我的理解,它的工作原因是数组已经是指针,对吧? 但是我配置的方式,我仍然传递结构的副本和所有东西到pass()函数? 我试图通过引用传递它,但它似乎不想以任何方式工作我尝试过。

C ++方式:

#include <array>

typedef std::array<GoldenHelmet, 10> Helmets;

void pass(Helmets &);

int main()
{
   Helmets h;
   h[1].foo = 1;
   pass(h);
   //...
}

void pass(Helmets & h)
{
   h[2].foo = 100;
   // ...
}

实际上,我们通过引用传递数组。

这个语法:

void pass (GoldenHelmet ofMambrino[], int size)

实际上很混乱。 因为您没有传递数组,所以传递指针。 它们不是一回事,不要混淆。 这种奇怪仅适用于功能参数。 以上与此完全相同:

void pass (GoldenHelmet * ofMambrino, int size)

实际上不可能按值传递数组,除非它是另一个对象的子对象。 您可以通过引用传递它们,但是您需要包含大小,但是您可以使用模板来执行此操作:

template<int N>
void pass (GoldenHelmet (&ofMambrino)[N])

这些都是可能的,但它们都没有通过值。 试想一下, ofMambrino是数组开头的地址,这就是你所传递的。

void pass (GoldenHelmet ofMambrino[], int size)
void pass (GoldenHelmet ofMambrino[10], int size)
void pass (GoldenHelmet *ofMambrino, int size)
void pass (GoldenHelmet (&ofMambrino)[10], int size)

数组被表示并作为指针传递,因此您不会在此处复制任何内容。 相反,如果您传递的是单个 struct ,则它将按值传递。

下面是一个代码片段,用于说明最后一点:

void passByVal (GoldenHelmet ofMambrino) {
    ofMambrino.foo = 100;
    ofMambrino.bar = "Blargh";
}

void passByRef (GoldenHelmet& ofMambrino) {
    ofMambrino.foo = 100;
    ofMambrino.bar = "Blargh";
}

int main() {
    GoldenHelmet h;
    passByVal(h); // h does not change
    passByRef(h); // fields of h get assigned in the call
}

首先,数组不是指针。 我们将其称为参数列表中的指针,因为我们使用时

int x[ ]

x实际上是指向数组开头的const指针。 当你将它传递给一个函数时,你会发送数组开头的内存地址。 这就是为什么当你对函数进行更改时,实际上在调用者部分中对变量的地址进行了更改。 这是通过参考实际模拟调用而不是通过引用调用。 但是效果与引用调用相同,因为您正在处理内存位置。 因此,当您发送结构数组时,实际上会传递结构数组的地址。 这就是为什么当你改变它的价值时,你实际上改变你的结构。

要通过引用使用调用,您必须做的一件事是定义您的函数原型

void f(int &param)

在调用函数时,它与其他函数相同。

总结一下:

int main()
{
     int x;

     // simulated call by reference that use adress of variable, 
     // lets say adress of x is 19ff 
     f(&x);     // actually you send 19ff

     f(x);      // call by reference that use reference of variable

}

// simulated call by reference
void f(const int *y)
{
    // when you use like *y=10, you are writing on memory area 19ff, you actually 
    // change memory area that is belong to x in the main

}

// call by reference
void f(const int &y)
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM