C++返回指向动态分配数组的指针
C++ return pointer to dynamically allocated 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
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 << " ";
}
}
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”