通过引用转移结构阵列 C++

所以我还是新人 programming/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 &amp;/;

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

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


实际上,我们通过引用传递一个数组。
</goldenhelmet,></array>

冰洋

赞同来自:

此语法:


void pass /GoldenHelmet ofMambrino[], int size/


事实上,它非常令人困惑。 由于您没有传递数组,因此传递指针。 但这并不是一样的,不要混淆。 此奇怪性仅适用于该功能的参数。 以上与此完全相同:


void pass /GoldenHelmet * ofMambrino, int size/


实际上,除非它是另一个对象的子对象,否则不可能将数组传输。 您可以将它们传递给链接,虽然您需要启用大小,但您可以使用模板执行以下操作:


template<int n="">
void pass /GoldenHelmet /&amp;ofMambrino/[N]/


</int>

风见雨下

赞同来自:

这一切都是可能的,但它们都不是值得的。 想想
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/
{
}

要回复问题请先登录注册