2012-12-26 102 views
2

我有点困惑。有两种方法可以从方法返回数组。第一个建议如下:返回一个数组...而是一个参考或指向数组的指针

typedef int arrT[10]; 
arrT *func(int i); 

但是,如何捕获返回是一个int(*)[]?

另一种方式是通过一个引用或指针:

int (*func(int i)[10]; 

int (&func(int i)[10]; 

返回类型是int(*)[]或INT(&)[]。

我遇到的问题是我怎么可以指定一个变量来接受的地步,我继续得到错误,如:

can't convert int* to int (*)[] 

任何想法,我做错了或什么是缺乏我的知识?

+0

函数原型中的括号不匹配。 –

+0

你似乎意外地设置了函数指针。那是你想要做的吗? –

+0

如果你不想要一个C++结构,只是一个普通的C数组,那么:“int * array(int * size); int size = 0; int * arr = array(&size);” – ArtemGr

回答

9

如果要按值返回数组,请将其放入结构中。

标准委员会已经这样做了,因此您可以使用std::array<int,10>

std::array<int,10> func(int i); 
std::array<int,10> x = func(77); 

这使得它非常简单的参照也返回:

std::array<int,10>& func2(int i); 
std::array<int,10>& y = func2(5); 
+0

我看到......我每天都在学习一些东西,但是专门针对我的情况,我如何从func指定一个返回变量?如果我使用指针I得到一个int *不会转换为int(*)[]的错误。 – user633658

+0

你可以举一个例子,其中返回一个对非''conststat'std :: array'的引用是个好主意。自然的用法(在头文件模块中提供一个数组,在整个程序中使用),我不认为作为初学者的OP会理解使用 –

+0

@Alf:在map > m;' 'm [“Ben”]的返回类型是'array &'(非''contst')。也许你想拥有会话本地存储(类似于线程本地存储)。访问者可能会返回一个'array &'。我相信你可以考虑其他的例子,如果你把它放在心上。 –

1

首先,你给的信息是不正确。

你写,

“有两种方法可以从方法返回数组”

,然后你给作为的方式

typedef int arrT[10]; 
arrT *func(int i); 

例子
int (*func(int i))[10]; 

(I ’已经添加缺少的右括号),在这里说,这后一种方式,在与第一,是通过引用或指针”

“一个例子

那么,这两个声明的意思是一模一样,即:

typedef int A[10]; 
A* fp1(int i) { return 0; } 

int (*fp2(int i))[10] { return 0; } 

int main() 
{ 
    int (*p1)[10] = fp1(100); 
    int (*p2)[10] = fp2(200); 
} 

在这两种情况下都会返回一个指向数组的指针,并将此指针键入为“指向数组的指针”。取消引用该指针会生成数组本身,该数组本身会再次衰减为指向自身的指针,但现在键入为“指向项目的指针”。它是指向数组的第一项的指针。在机器码级,这两个指针在实践中完全一样。来自Pascal背景使我困惑了很长时间,但结果是,因为它通常不适合在类型中携带数组大小(这排除了处理不同运行时大小的数组),所以大多数数组处理代码优惠指针指向第一项而不是指向整个数组的指针。

即,像功能一般如此低的水平C语言将被声明为只

int* func() 

返回一个指针,指向在运行时建立大小的数组的第一项。现在

,如果你想通过值返回数组那么你有两种选择:

  • 返回值由一个固定大小的数组:把它放在一个struct
    该标准已经提供了这样的模板类,std::array

  • 按值返回一个可变大小的数组:使用一个处理复制的类。
    该标准已经提供了这样的模板类,std::vector

例如,

#include <vector> 
using namespace std; 

vector<int> foo() { return vector<int>(10); } 

int main() 
{ 
    vector<int> const v = foo(); 
    // ... 
} 

这是最一般的。使用std::array更适合特殊情况。作为初学者,请记住Donald Knuth ’的建议:“不成熟的优化是万恶之源。 ”也就是说,只要使用std::vector,除非真的有很好的理由使用std::array

+0

不要误解我的意思,我知道C++应该使用向量而不是数组,但在我目前的学习中,我正在学习如何从func返回一个数组。另外,第一个声明是一个typedef,然后使用typedef。它们不是两种返回数组的方法。第二个列表是第二个方法。这仍然不能帮助我理解如何将变量分配给回报...哇这是我的问题。如果我有一个func定义如下:auto func(int i) - > int(*)[10]那么如何定义一个变量来获取数组?这是我的问题!!!!! – user633658

+0

@ user633658:re“第二个列表是第二个方法”,** NO **。它意味着与第一个完全相同。如上所示。 –

+0

@ user633658:re“如何定义一个变量来接收数组”,请参阅此答案中给出的完整示例代码。 –

0
using arrT10 = int[10]; // Or you can use typedef if you want 

arrT10 * func(int i) 
{ 
    arrT10 a10; 
    return &a10; 

    // int a[10]; 
    // return a; // ERROR: can't convert int* to int (*)[] 
} 

这会给你一个警告,因为func返回一个局部变量的地址,所以我们永远不应该这样的代码,但我敢肯定,这个代码可以帮助你。

相关问题