int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
int j = 0;
int *new_array=NULL;
new_array = new int[nrValues];
for (int i = 0; i < nrValues; i++)
if (values[i] >= givenValue)
{
new_array[j] = values[i];
j++;
}
return new_array;
}
void main() {
int y[] = { 1,2,100,18,20,94 };
cout<< filtrationBiggerValues(y, 6, 8)<<"\n";
}
我应该看到新数组的值大于某个特定值,但是我得到了它的地址。
答案 0 :(得分:1)
这不是它的工作方式。您从函数返回的指针不是值。如果要查看输出值,则应在数组上进行迭代并分别打印出每个元素。另外请注意从函数返回输出数组的大小,以方便迭代。
int* filtrationBiggerValues(int* values, int nrValues, int givenValue, int& outputSize) {
int j = 0;
int *new_array=NULL;
new_array = new int[nrValues];
for (int i = 0; i < nrValues; i++)
if (values[i] >= givenValue)
{
new_array[j] = values[i];
j++;
}
outputSize = j;
return new_array;
}
void main()
{
int y[] = { 1,2,100,18,20,94 };
int outputSize = 0;
int* output = filtrationBiggerValues(y, 6, 8, outputSize);
for(int i=0; i<outputSize; ++i)
{
cout<< output[i] <<"\n";
}
}
更新(如果您希望保持功能签名不变)
int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
int j = 0;
int *new_array=NULL;
new_array = new int[nrValues];
for (int i = 0; i < nrValues; i++)
if (values[i] >= givenValue)
{
new_array[j] = values[i];
j++;
}
new_array[j] = 0;
return new_array;
}
void main()
{
int y[] = { 1,2,100,18,20,94 };
int* output = filtrationBiggerValues(y, 6, 8);
for(int i=0; output[i]>0; ++i)
{
cout<< output[i] <<"\n";
}
}
答案 1 :(得分:0)
数组的名称实际上是一个指针。 如果您尝试这样做:
int main()
{
int y[] = { 1,2,100,18,20,94 };
cout << y <<endl;
cout<< filtrationBiggerValues(y, 6, 8)<<"\n";
return 0;
}
输出是两个地址
0x7ffd7ac2bc10
0xfadc30
答案 2 :(得分:0)
这么多话:
int* new_array = NULL;
C ++使用nullptr
。即int* new_array = nullptr;
但是,您应该包含下一行所做的初始化:
int* new_array = new int[nrValues];
但是您只是在堆上创建了一个新对象,而没有delete
。这就是所谓的内存泄漏。如今,我们使用唯一的指针来帮助我们。
std::unique_ptr<int[]> new_array = new int[nrValues];
但是,在C ++中,我们有STL容器为您处理所有C样式的数组内容。由于new_array
与values
的大小不同,因此您可能要使用具有动态大小的std::vector
。 STL容器有一个名为iterators
的东西,可以更有效地遍历元素。但是,STL容器没有默认的输出功能,因此您必须编写自己的输出。
#include<vector>
#include<iostream>
std::vector<int> getBiggerThen(std::vector<int> const& input, int givenValue) {
std::vector<int> output;
for (auto it = input.cbegin(); it != input.cend(); it++) {
if (*it > givenValue) {
output.push_back(*it);
}
}
return output;
}
std::ostream& operator<< (std::ostream& out, std::vector<int> const& vec) {
for (auto const& el : vec) out << el << " ";
return out;
}
int main() {
auto y = std::vector<int>{ 1,2,100,18,20,94 };
std::cout << getBiggerThen(y, 8) << "\n";
}
哦...也很重要:在C ++中,main
应该总是返回int
。
最后,您经常要做的事情是,STL库具有内置的算法。可以减少一切
#include<vector>
#include<algorithm>
#include<iostream>
int main() {
auto y = std::vector<int>{ 1,2,100,18,20,94 };
std::vector<int> output{};
int givenValue = 8;
std::copy_if(std::cbegin(y), std::cend(y), std::back_inserter(output),
[givenValue](int val) { return val >= givenValue; });
for (auto const& el : output) std::cout << el << " ";
std::cout << "\n";
}