struct zone {
int a;
double b;
};
zone *abc() {
static zone r[10];
for (int i = 0; i < 10; i++) {
r[i].a = 2 * i;
[r[i].b=0.5*i;
cout << r[i].a << " " << r[i].b << endl;
}
return r;
}
int main() {
zone *PP;
zone P[10];
PP = abc();
for (int i = 0; i < 10; i++) {
P[i] = (PP + i);
cout << "work" << P[i].a << endl;
}
getch();
}
我需要返回一个由main调用的函数中形成的结构数组。我设法用指针检索数组,但是使用struct它不起作用。
如何返回结构数组?
答案 0 :(得分:1)
您正在使用指针指定变量值:
P[i] = (PP + i);
要获取内部值的副本,您需要访问struct:
P[i] = PP[i];
会是这样的:
#include <iostream>
using namespace std;
struct zone {
int a;
double b;
};
zone *abc() {
static zone r[10];
for (int i = 0; i < 10; i++) {
r[i].a = 2 * i;
r[i].b=0.5*i;
cout << r[i].a << " " << r[i].b << endl;
}
return r;
}
int main() {
zone *PP;
zone P[10];
PP = abc();
for (int i = 0; i < 10; i++) {
P[i] = PP[i];
cout << "work" << P[i].a << endl;
}
}
您的结构只包含数字,但是,如果它包含字符串或指针,则需要进行深层复制。
答案 1 :(得分:0)
C ++的一个很酷的功能是使用引用。参考文献的最佳部分是它们允许您在不复制数据的情况下传递数据(您在内部使用相同的数据并传回)。所以如果你做了一个功能。
另一种方法是使用指向指针的指针。您可以在函数中传递指针和malloc的指针指针或地址。
structure* a;
funct(&a);
printf("%s\n", a[0].printfunction());
printf("%s\n", a[1].printfunction());
...
void funct(structure** a, int size){
*a = (structure*)malloc(sizeof(structure) * size);
(*a)[0] = ...
(*a)[1] = ..
(*a)[ size-1] = ...
}
您可以在函数外部访问数组。请务必使用malloc / new释放/删除您调用的任何内容。上面的代码可以使用新的我只是更好用c。您可以轻松地将malloc拉出函数外部,只需传入一个指向数组的指针。
答案 2 :(得分:0)
在C中,函数不能接受或返回数组。这很烦人,我从来没有听过一个很好的理由。无论如何,C ++很久以前就解决了这个问题,但它从来没有真正流行起来,原因很简单。
强制性的#34;对于任何大于玩具应用程序的东西,你应该强烈重新考虑使用裸指针和/或原始数组!&#34;
C ++引入了参考资料。它们实际上只是指针周围的语法糖,但并非所有变量只是指针周围的语法糖?在C ++中,函数可以接受和/或返回对数组的引用。像这样:
int takes (char (&arr)[10])
{
std::cout << sizeof(arr); // 10
}
int (&returns())[10]
{
return some_array; // Not a pointer!
}
int (&takes_and_returns (int (&arr)[10])) [10]
{
return arr;
}
当然,我不必告诉你这是非常丑陋和难以阅读的。现代C ++救援!
template <size_t n, typename T>
using array<n,t> = T[n];
int takes (array<10,int>& arr);
array<10,int>& returns();
array<10,int>& takes_and_returns (array<10,int>& arr);
但请注意,由于new
的工作方式,正确构造然后返回对动态数组的引用是一种折磨。我就是这样做的,但我甚至不确定这是否正确;可能潜伏一些UB:
int (&returns())[10]
{
int* x = new int[10];
return *(int(*)[10]) x;
}
当然,我们可以稍微整理一下:
using arr10 = int[10];
arr10& returns()
{
int* x = new int[10];
return *(arr10*) x;
}
然后,在通话网站上,您将其分配给参考,如下所示:
int (&my_array)[10] = returns();
// doing stuff ...
delete[] &my_array;
正如您所看到的,在一天结束时,让所有这些正常工作并与现有功能互操作是一种折磨。如果你需要一个函数来获取或返回一个数组,你就是这样做的。但是对于大多数用途,使用标准库容器会更好(更容易,更安全)。
答案 3 :(得分:0)
非常简单 - 通过使用另一个结构来封装返回的数组,以便克服C&#39; C&#39;语言限制。
struct zone {
int a;
double b;
};
struct zone_array_of_10 {
zone arr[10];
};
zone_array_of_10 abc() {
zone_array_of_10 r;
for (int i = 0; i < 10; i++) {
r.arr[i].a = 2 * i;
r.arr[i].b=0.5*i;
cout << r.arr[i].a << " " << r.arr[i].b << endl;
}
return r;
}
int main() {
zone_array_of_10 PP;
PP = abc();
for (int i = 0; i < 10; i++) {
cout << "work" << PP.arr[i].a << endl;
}
getch();
}
事实上,在&#39; C&#39;语言数组不能通过值传递。但结构可以。所以每当你想要传递一些数组的实际内容时没有太多麻烦 - 只需将它封装在一个结构中。