我正在阅读这篇文章 [Function returning a pointer to an int array]并了解返回pointer to int
和pointer to an array of int
之间的区别。
在尝试总结时,我遇到了一些问题。首先,看看这段代码(保持简单):
函数test
和test2
返回pointer to int
和pointer 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
答案 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