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

C++ return pointer to dynamically allocated array

本文关键字:数组 指针 动态分配 返回 C++      更新时间:2023-10-16

我正在阅读这篇文章[返回指向整数数组的指针的函数]并学习返回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 
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[]已经是一个相当破碎的语言功能,你对额外的指针、引用和 C 语法特性进行额外的混淆工作并不能让它变得更好。这是C++,请使用std::vector

#include <iostream>
#include <vector>
std::vector<int> test() {
return { 1, 2, 3 };
}
int main() {
for (auto num : test()) {
std::cout << num << " ";
}
}