将数组从函数返回到 C++ 中的 main
Returning an array from a function to main in c++
我怎样才能return这个数组到主函数以便在我的程序中进一步使用?
int* enterMarks(int marks) {
int arr[marks];
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;
for (int i = 0; i < marks; i++) {
cout << i+1 << ">";
cin >> arr[i];
}
cout << "Thank you..." << endl;
return *arr;
int arr[marks];
这是一个局部变量,所以你不能return它,否则行为未定义,导致崩溃等
你有两个选择
1) 在堆中分配数组并return它
int *arr = (int *)malloc(sizeof(int)*marks);
...
return arr;
然后您必须 free
调用函数中的 arr。
2) 更好,使用 C++ 向量和 return 它
std::vector<int> arr;
...
cin >> mark;
arr.push_back(mark);
...
return arr;
这样你就不用记得释放堆内存了。
您不应该 return 指向您在函数的局部范围内定义的变量的指针,即在您的情况下 arr
.
Return std::vector
的副本。
#include <vector>
vector<int> enterMarks(int marks) {
vector<int> arr;
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;
for (int i = 0; i < marks; i++) {
cout << i+1 << ">";
int mark;
cin >> mark;
arr.push_back(mark);
}
cout << "Thank you..." << endl;
return arr;
}
要在 main 中打印出这些值,您可以简单地执行以下操作。
vector<int> arr = enterMarks(marks);
for (int i = 0; i < arr.size(); i++) {
cout << "Mark " << i << " = " << arr[i] << endl;
}
对于像这样的初学者可变长度数组
int* enterMarks(int marks) {
int arr[marks];
//...
不是标准的 C++ 功能。在 C++ 中,数组的大小应为编译时常量。
其次,从函数返回的指向具有自动存储持续时间的本地数组的指针将具有无效值,因为退出函数后本地数组将不存在。
你需要有一个动态分配的数组。
您也可以使用智能指针 std::unique_ptr
指向一个动态分配的数组,如下面的演示程序所示。
#include <iostream>
#include <memory>
std::unique_ptr<unsigned int[]> enterMarks( size_t marks )
{
const unsigned HIGH_MARK = 100;
auto arr = std::make_unique<unsigned int[]>( marks );
std::cout << "Please enter " << marks
<< " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;
for ( size_t i = 0; i < marks; i++ )
{
std::cout << i+1 << "> ";
std::cin >> arr[i];
}
std::cout << "Thank you..." << std::endl;
return arr;
}
int main()
{
size_t n = 10;
auto arr = enterMarks( n );
for ( size_t i = 0; i < n; i++ )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
return 0;
}
程序输出可能看起来像
Please enter 10 marks (0<=Mark<=100):
1> 10
2> 20
3> 30
4> 40
5> 50
6> 60
7> 70
8> 80
9> 90
10> 100
Thank you...
10 20 30 40 50 60 70 80 90 100
或者您可以使用标准 class 模板 std::vector,如下所示。
#include <iostream>
#include <vector>
std::vector<unsigned int> enterMarks( size_t marks )
{
const unsigned HIGH_MARK = 100;
std::vector<unsigned int> arr( marks );
std::cout << "Please enter " << marks
<< " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;
for ( size_t i = 0; i < marks; i++ )
{
std::cout << i+1 << "> ";
std::cin >> arr[i];
}
std::cout << "Thank you..." << std::endl;
return arr;
}
int main()
{
size_t n = 10;
auto arr = enterMarks( n );
for ( size_t i = 0; i < n; i++ )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
return 0;
}
程序输出可能与上面所示的方式相同。
注意maje有符号整数类型的数组没有太大意义int
。最好使用无符号整数类型 unsigned int
.
我怎样才能return这个数组到主函数以便在我的程序中进一步使用?
int* enterMarks(int marks) {
int arr[marks];
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;
for (int i = 0; i < marks; i++) {
cout << i+1 << ">";
cin >> arr[i];
}
cout << "Thank you..." << endl;
return *arr;
int arr[marks];
这是一个局部变量,所以你不能return它,否则行为未定义,导致崩溃等
你有两个选择
1) 在堆中分配数组并return它
int *arr = (int *)malloc(sizeof(int)*marks);
...
return arr;
然后您必须 free
调用函数中的 arr。
2) 更好,使用 C++ 向量和 return 它
std::vector<int> arr;
...
cin >> mark;
arr.push_back(mark);
...
return arr;
这样你就不用记得释放堆内存了。
您不应该 return 指向您在函数的局部范围内定义的变量的指针,即在您的情况下 arr
.
Return std::vector
的副本。
#include <vector>
vector<int> enterMarks(int marks) {
vector<int> arr;
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;
for (int i = 0; i < marks; i++) {
cout << i+1 << ">";
int mark;
cin >> mark;
arr.push_back(mark);
}
cout << "Thank you..." << endl;
return arr;
}
要在 main 中打印出这些值,您可以简单地执行以下操作。
vector<int> arr = enterMarks(marks);
for (int i = 0; i < arr.size(); i++) {
cout << "Mark " << i << " = " << arr[i] << endl;
}
对于像这样的初学者可变长度数组
int* enterMarks(int marks) {
int arr[marks];
//...
不是标准的 C++ 功能。在 C++ 中,数组的大小应为编译时常量。
其次,从函数返回的指向具有自动存储持续时间的本地数组的指针将具有无效值,因为退出函数后本地数组将不存在。
你需要有一个动态分配的数组。
您也可以使用智能指针 std::unique_ptr
指向一个动态分配的数组,如下面的演示程序所示。
#include <iostream>
#include <memory>
std::unique_ptr<unsigned int[]> enterMarks( size_t marks )
{
const unsigned HIGH_MARK = 100;
auto arr = std::make_unique<unsigned int[]>( marks );
std::cout << "Please enter " << marks
<< " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;
for ( size_t i = 0; i < marks; i++ )
{
std::cout << i+1 << "> ";
std::cin >> arr[i];
}
std::cout << "Thank you..." << std::endl;
return arr;
}
int main()
{
size_t n = 10;
auto arr = enterMarks( n );
for ( size_t i = 0; i < n; i++ )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
return 0;
}
程序输出可能看起来像
Please enter 10 marks (0<=Mark<=100):
1> 10
2> 20
3> 30
4> 40
5> 50
6> 60
7> 70
8> 80
9> 90
10> 100
Thank you...
10 20 30 40 50 60 70 80 90 100
或者您可以使用标准 class 模板 std::vector,如下所示。
#include <iostream>
#include <vector>
std::vector<unsigned int> enterMarks( size_t marks )
{
const unsigned HIGH_MARK = 100;
std::vector<unsigned int> arr( marks );
std::cout << "Please enter " << marks
<< " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;
for ( size_t i = 0; i < marks; i++ )
{
std::cout << i+1 << "> ";
std::cin >> arr[i];
}
std::cout << "Thank you..." << std::endl;
return arr;
}
int main()
{
size_t n = 10;
auto arr = enterMarks( n );
for ( size_t i = 0; i < n; i++ )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
return 0;
}
程序输出可能与上面所示的方式相同。
注意maje有符号整数类型的数组没有太大意义int
。最好使用无符号整数类型 unsigned int
.