所以我仍然是编程/ 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()函数?我试图通过引用传递它,但它似乎不想以我试过的方式工作。
答案 0 :(得分:6)
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;
// ...
}
的确,我们通过引用传递数组。
答案 1 :(得分:5)
此语法:
void pass (GoldenHelmet ofMambrino[], int size)
实际上很混乱。因为您没有传递数组,所以传递指针。它们不是一回事,不要混淆。这种奇怪仅适用于功能参数。以上与此完全相同:
void pass (GoldenHelmet * ofMambrino, int size)
实际上不可能按值传递数组,除非它是另一个对象的子对象。您可以通过引用传递它们,但是您需要包括大小,但是您可以使用模板来执行此操作:
template<int N>
void pass (GoldenHelmet (&ofMambrino)[N])
答案 2 :(得分:4)
这些都是可能的,但它们都没有通过值传递。只要将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)
答案 3 :(得分:1)
数组被表示并作为指针传递,因此您不会在此处复制任何内容。相反,如果您传递单 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
}
答案 4 :(得分:0)
首先,数组不是指针。我们将其称为参数列表中的指针,因为当我们使用
时int x[ ]
x实际上是指向数组开头的const指针。当你将它传递给一个函数时,你会发送数组开头的内存地址。这就是为什么当你对函数进行更改时,实际上在调用者部分中对变量的地址进行了更改。这是通过参考实际模拟调用而不是通过引用调用。但是效果与引用调用相同,因为您正在处理内存位置。因此,当您发送结构数组时,实际上会传递结构数组的地址。这就是为什么当你改变它的价值时,你实际上改变了你的结构。
要使用引用调用,您必须做的一件事是定义函数原型,如
void f(int ¶m)
当调用函数时,它与其他函数相同。
总结:
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)
{
}