返回指向新建数组的指针

时间:2014-07-08 04:24:05

标签: c++ pointers

指向数组的指针声明为Type (*p)[N];。例如,

int a[5] = { 1, 2, 3, 4, 5 };
int(*ptr_a)[5] = &a;
for (int i = 0; i < 5; ++i){
    cout << (*ptr_a)[i] << endl;
}

会在a中输出五个整数。

如何从new int[5]转换为int (*p)[5]类型。

例如,当我编写一个返回指向新数组的指针的函数时,以下代码无法编译。

int (*f(int x))[5] {
    int *a = new int[5];
    return a; // Error: return value type does not match the function type.
}

它产生:

error: cannot convert ‘int*’ to ‘int (*)[5]’

6 个答案:

答案 0 :(得分:5)

您可以使用:

int (*a)[5] = new int[1][5];

示例:

#include <iostream>

int main()
{
   int (*a)[5] = new int[1][5];
   for ( int i = 0; i < 5; ++i )
   {
      (*a)[i] = 10*i;
      std::cout << (*a)[i] << std::endl;
   }
   delete [] a;
}

输出:

0
10
20
30
40

答案 1 :(得分:4)

您可以使用typedef清理代码,然后更容易看到如何使其运行:

#include <iostream>

typedef int (*P_array_of_5_ints)[5];

P_array_of_5_ints f() {
    int *a = new int[5];
    *a = 42;
    return (P_array_of_5_ints)a;
}

int main()
{
    P_array_of_5_ints p = f();
    std::cout << (*p)[0] << '\n';
}

(见运行here at ideone.com

答案 2 :(得分:1)

你有这个标记的C ++所以请不要这样做。请改用vector。它清除了整个语法,确保你不会泄漏内存!

std::vector<int> f(int x)
{
    std::vector<int> a(5);
    return a;
}

答案 3 :(得分:1)

#include <iostream>
using namespace std;

int (*f(int x))[5]
{
    int (*a)[5] = new int[1][5];
    return a; // Error: return value type does not match the function type.
}


int main(void)
{

 int a[5] = { 5, 4, 3, 2, 1 };
 int(*ptr_a)[5] = &a;
 for (int i = 0; i < 5; ++i)
 {
    cout << (*ptr_a)[i] << endl;
    cout << f(i) << endl;
 }
}

答案 4 :(得分:1)

C ++ 11有更好的方法来处理固定大小的数组。我建议使用std :: array而不是c-style数组。现代编译器应该发出与指针版本相同的高效代码。

std::array<int,5> f()
{
    std::array<int,5> a;
    return a; 
}

如果你真的想弄乱指针,请使用以下内容。

std::array<int,5>* f()
{
    std::array<int,5>* a = new std::array<int,5>;
    return a; 
}

我还建议不要使用原始指针而是使用智能指针(例如std :: unique_ptr),以防止因忘记删除数组而导致内存泄漏。

typedef std::array<int,5> array_of_5_ints;
std::unique_ptr<array_of_5_ints> f()
{
    std::unique_ptr<array_of_5_ints> a = new std::array<int,5>;
    return a; 
}

答案 5 :(得分:-2)

将您的功能更改为

int (*f())[5] {
    int *a = new int[5];
    //code ...
    return (int (*)[5])a;
}