c ++中的指针和自增量参数

时间:2014-04-18 08:11:46

标签: c++ pointers arguments

请记住,我是指针的新手。

我想要完成的是每次迭代这个for循环时value增加一个double值(在这种情况下,.013):

/***********************************************************************************
@name:      fill_array

@purpose:   fill all elements in range 'begin' to 'end' with 'value'

@param:     double* begin   address of first element of the array range

@param:     double* end     address of the next byte past the end of the array range

@param:     double  value   the value to store in each element

@return:    void
***********************************************************************************/

void fill_array(double* begin, double* end, double value) {

    for( ; begin < end; begin++)
        *begin = value == 0.0 ? 0.0 : value;
}

不起作用的驱动程序代码示例(我只提供此代码以便我可以更好地传达我想要完成的内容):

double dataValue = 3.54;

double* currentData = &dataValue;

fill_array(begin, end, *currentData+.013);

当然,存储在数组中的所有值都是3.553。

我是否需要创建一个带有返回值的函数作为参数传递给形式参数&#39; value&#39;?或者这可以仅使用指针完成?

3 个答案:

答案 0 :(得分:1)

只需在每次迭代中递增值:

for( ; begin < end; begin++) {
    *begin = value == 0.0 ? 0.0 : value;
    value += 0.013;
}

如果你想要0.013为动态,你应该为你的函数添加另一个参数(例如double incrementer)。

答案 1 :(得分:1)

  每次迭代此for循环时,

值会增加一个double值(在本例中为.013):

嗯,value是调用者提供的函数参数,因此调用者可以像这样修改它:

fill_array(begin, end, *currentData += .013);

如果您不希望调用代码修改该值,那么您必须进行一些其他更改,因为给定...

fill_array(begin, end, *currentData+.013);

... value参数提供了添加的临时结果,并且没有fill_array可以要求控制的非临时变量,以便它可以添加到它并查看对下次通话的影响。这可以通过几种方式解决,使用指针...

void fill_array(double* begin, double* end, double* p_value) {
    for( ; begin < end; begin++)
        *begin = *p_value;
    *p_value += 0.13;
}
fill_array(begin, end, currentData);

......或使用参考文献......

void fill_array(double* begin, double* end, double& value) {
    for( ; begin < end; begin++)
        *begin = value;
    value += 0.13;
}
fill_array(begin, end, *currentData);

答案 2 :(得分:0)

您无法使用fill_array函数执行此任务。但是你可以专门为这个任务重载它。例如

void fill_array( double *begin, double *end, double init, double incr ) 
{
    init = init == 0.0 ? 0.0 : init;

    if ( begin != end ) 
    {
        *begin = init;

        while ( ++begin != end ) *begin = init += incr;
    }
}

如果您将最后一个参数定义为具有默认参数,则甚至只能有一个函数。 例如

void fill_array( double *begin, double *end, double init, double incr = 0.0 ) 
{
    init = init == 0.0 ? 0.0 : init;

    if ( begin != end ) 
    {
        *begin = init;

        while ( ++begin != end ) *begin = init += incr;
    }
}

因此,如果您将其称为

fill_array( begin, end, 3.54 );

它将表现为您的原始功能。

如果您将其称为

fill_array( begin, end, 3.54, 0.13 );

它会像你想要的那样表现。