C ++返回指向动态分配的数组

时间:2018-01-13 10:38:55

标签: c++ arrays pointers

我正在阅读这篇文章 [Function returning a pointer to an int array]并了解返回pointer to intpointer to an array of int之间的区别。
在尝试总结时,我遇到了一些问题。首先,看看这段代码(保持简单):

函数testtest2返回pointer to intpointer to an array of int

int* test(size_t &sz) {
    int *out = new int[5];
    sz = 5;
    return out;
}

int (*test2())[3] {
    static int out[] = {1, 2, 3};
    return &out;
}

如何更改test2以使用动态数组(非静态)?是否可以传递数组大小作为参考或以某种方式?
主要功能看起来像这样。代码编译。

int main() {
    size_t sz;
    int *array = test(sz);
    for (size_t i = 0; i != sz; ++i) {
        array[i] = 10;
        cout << *(array + i) << " ";
    }
    cout << endl;    
    delete[] array;

    int (*array2)[3] = test2();
    for (size_t i = 0; i != 3; ++i) {
        cout << (*array2)[i] << " ";
    }
}

结果

10 10 10 10 10 
1 2 3 

1 个答案:

答案 0 :(得分:2)

test2不会返回指向单个int的指针,而是指向3个元素int数组的指针。我鼓励您尝试精彩的https://cdecl.org/网站,输入int (*test2())[3]并亲眼看看。

您可能尝试返回new int[3]但失败了。那是因为new[]返回指向单个int(动态分配的数组的第一个元素)的指针,并且指向单个int的指针不会自动转换为指向整个int的指针许多test2的数组。

  

如何更改int (*test2())[3] { return reinterpret_cast<int(*)[3]>(new int[3] { 1, 2, 3 }); // horrible code } 以使用动态数组(非静态)?

严格技术上说话,如下:

test2
  

是否可以传递数组大小作为参考或以某种方式?

new[]的情况下,数组的大小是类型的一部分,因此在编译时固定。您不能通过传递引用来在运行时更改类型。

现在,认真。

没有人在他们的脑海里写这样的代码。 std::vector已经是一个非常破碎的语言功能,你额外的混淆工作与额外的指针,引用和C语法特性并没有使它更好。这是C ++,使用#include <iostream> #include <vector> std::vector<int> test() { return { 1, 2, 3 }; } int main() { for (auto num : test()) { std::cout << num << " "; } }

precision = 3