理解指针结构

Understanding-pointer to a structure

我想了解如何将指向结构的指针传递给函数参数并实现。 avrg_stpc[idx_u16].sum_f32 数组如何工作?

typedef struct
{
    const float * input_f32p;
    float avg_f32;
    float sum_f32;
    float factor_f32;
    unsigned int rs_u16;
} avgminmax_avg_t;


void avgminmax_AvgCalculate_vd(
  avgminmax_avg_t * const avrg_stpc, 
  const unsigned int numOfEntrys_u16c)
{
    unsigned int idx_u16 = 0u;
    do
    {
        avrg_stpc[idx_u16].sum_f32 += (*avrg_stpc[idx_u16].input_f32p
                                 - avrg_stpc[idx_u16].avg_f32);
        avrg_stpc[idx_u16].avg_f32 = (avrg_stpc[idx_u16].sum_f32 *
                                      avrg_stpc[idx_u16].factor_f32);
        idx_u16++;
    }while(idx_u16 < numOfEntrys_u16c);
}

avrg_stpc被认为是一个数组(可能是通过.*alloc分配在堆上);因为它的边界是未知的,所以是函数的第二个参数。看这里:https://en.cppreference.com/w/c/language/operator_member_access

几点可以帮助您理解数组和指针及其关系:

  • 一个指针实际上只指向一个 "object",但那个对象可能是数组中的第一个。

  • 数组自然衰减为指向其第一个元素的指针。

  • 而数组索引等同于指针运算(对于任何指针或数组a和索引i,表达式a[i]正好等于*(a + i)).


至于你的具体示例代码,如果你这样想可能会更容易:

avgminmax_avg_t *temp_ptr = &avrg_stpc[idx_u16];
temp_ptr->sum_f32 += ...;
temp_ptr->avg_f32 = ...;

或者可能喜欢:

avgminmax_avg_t temp_object = avrg_stpc[idx_u16];
temp_object.sum_f32 += ...;
temp_object.avg_f32 = ...;
avrg_stpc[idx_u16] = temp_obj;

上面的两个代码片段都会导致与您现有代码相同的结果,但需要一个额外的临时变量,并且在后面的代码片段中复制结构两次。