对于像这样的初学者可变长度数组
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
或者你可以使用如下所示的标准类模板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;
}
程序输出可能与上面显示的方式相同。
注意,对有符号整数类型int的数组进行maje没有太大意义。最好使用无符号整数类型unsigned int。