我对 C++ 还很陌生,并且一直在避免使用指针。根据我在网上阅读的内容,我无法返回数组,但可以返回指向它的指针。我做了一个小代码来测试它,想知道这是否是正常/正确的方法:
#include <iostream>
using namespace std;
int* test (int in[5]) {
int* out = in;
return out;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* pArr = test(arr);
for (int i = 0; i < 5; i++) cout<<pArr[i]<<endl;
cout<<endl;
return 0;
}
编辑:这似乎不好。我应该如何重写它?
int* test (int a[5], int b[5]) {
int c[5];
for (int i = 0; i < 5; i++) c[i] = a[i]+b[i];
int* out = c;
return out;
}
最佳答案
您的代码是正确的,但我很难弄清楚它可以/将如何在现实世界的场景中使用。话虽如此,请注意从函数返回指针时的一些注意事项:
- 当您使用语法
int arr[5];
创建数组时,它分配在堆栈上并且是函数本地的。 - C++ 允许你返回一个指向这个数组的指针,但是在它的本地范围之外使用这个指针指向的内存是未定义的行为。阅读 this great answer using a real world analogy比我能解释的要清楚得多。
- 如果你能保证数组的内存没有被清除,你仍然可以在作用域之外使用数组。在您的情况下,当您通过
arr
时,这是正确的。至test()
. - 如果您想传递指向动态分配数组的指针而不担心内存泄漏,您应该阅读
std::unique_ptr
/std::shared_ptr<>
.
编辑 - 回答矩阵乘法的用例
你有两个选择。天真的方法是使用 std::unique_ptr
/std::shared_ptr<>
.现代 C++ 方法是有一个 Matrix
重载的类operator *
你绝对必须使用新的rvalue references
如果您想避免复制乘法的结果以使其脱离函数。除了拥有您的copy constructor
, operator =
和 destructor
,你还需要有move constructor
和 move assignment operator
.浏览this search的问答以更深入地了解如何实现这一目标。
编辑 2 - 对附加问题的回答
int* test (int a[5], int b[5]) {
int *c = new int[5];
for (int i = 0; i < 5; i++)
c[i] = a[i]+b[i];
return c;
}
如果您将其用作 int *res = test(a,b);
,那么稍后在您的代码中,您应该调用 delete []res
释放 test()
中分配的内存功能。您现在看到的问题是手动跟踪何时调用 delete
非常困难。 .因此,答案中概述了如何处理它的方法。
关于C++从函数返回指向数组的指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992925/