传递这个双指针并获取值有什么问题?

What's wrong on passing this double pointer and get the value?

我是 new/noob C++ 程序员,我遇到了这个问题。我想将一个 double 指针传递给一个函数(它将处理它上面的一些数据)并读取(在处理之后)该 "array" 的固定值。我做过 this:

void ReadDoubles(double* samples, int size)
{
    for (int i=0; i < size; ++i)
    {
        *samples = i*10.1;
        samples++;
    }    
}

int main()
{
    int size = 10;
    double *values=0;
    ReadDoubles(values, size);
    cout << *(values+3);
}

但是当然,我似乎不能那样初始化指针。我想我需要初始化分配 10 个值的指针?尝试过:

double *values[size];

但这不是解决方案。你会如何完成这个简单的任务?

您需要先分配数组。给你

#include <iostream>

void ReadDoubles( double* samples, size_t size )
{
    for ( size_t i = 0; i < size; ++i )
    {
        *samples = i*10.1;
        samples++;
    }    
}

int main()
{
    size_t size = 10;
    double *values = new double[size];
    //               ^^^^^^^^^^^^^^^^  

    ReadDoubles( values, size );

    std::cout << *(values+3) << std::endl;

    delete []values;
}

程序输出为

30.3

如果您不想使用运算符 new,则有两种通用方法。您可以声明一个数组,例如

int main()
{
    const size_t size = 10;
    //^^^^
    double values[size];
    //     ^^^^^^^^^^^^  

    ReadDoubles( values, size );

    std::cout << *(values+3) << std::endl;
}

或者您可以使用标准 class std::vector<double>。在这种情况下,应该适当地重写函数。

例如

#include <iostream>
#include <vector>

void ReadDoubles( std::vector<double> &samples, size_t size )
{
    samples.resize( size );

    for ( size_t i = 0; i < size; ++i )
    {
        samples[i] = i*10.1;
    }    
}

int main()
{
    size_t size = 10;
    std::vector<double> values;

    ReadDoubles( values, size );

    std::cout << values[3] << std::endl;
}

如果不允许您更改 RealDoubles 函数并且您必须有一个 return 大小的函数,那么以下应该有效:

#include <string>
#include <iostream>
#include <math.h>
#include <cmath>

using namespace std;

void ReadDoubles(double* samples,int size)
{
    for (int i=0; i < size; ++i) {
        *samples = i*10.1; 
        samples++;
    }
}

int get_size()
{
    return 10;
}

int main()
{
    int size = get_size(); // get size from function
    //double *values=0;
    double *values = new double[size] {0}; // Use new to allocate array. Optional: use {0} to init first element to 0, others default initialized to 0
    ReadDoubles(values,size);
    cout << *(values+3);
    delete[] values;
}

如果您希望避免使用 newdelete,那么您可以让 std::vector 为您管理容器:

#include <string>
#include <iostream>
#include <math.h>
#include <cmath>
#include <vector>

using namespace std;

void ReadDoubles(double* samples,int size)
{
    for (int i=0; i < size; ++i) {
        *samples = i*10.1; 
        samples++;
    }
}

int get_size()
{
    return 10;
}

int main()
{
    int size = get_size(); // get size from function
    //double *values=0;
    std::vector<double> value_container(size,0); // vector will do the new and delete for us
    double *values = value_container.data();
    ReadDoubles(values,size);
    cout << *(values+3);
} // vector destructor will do delete when it goes out of scope