Search code examples
cpointersstructure

Understanding-pointer to a structure


I want to understand how the pointer to the structure is passed to the function argument and implemented. How is avrg_stpc[idx_u16].sum_f32 array is working?

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);
}

Solution

  • A few points that could help you understand arrays and pointers and their relationship:

    • A pointer really only points to one "object", but that object might be the first in an array.

    • Arrays naturally decays to pointers to their first element.

    • And array indexing is equivalent to pointers arithmetic (for any pointer or array a and index i, the expression a[i] is exactly equal to *(a + i)).


    As for your specific example code, perhaps it would be easier if you thought of it similar to this:

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

    Or perhaps like:

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

    Both the snippets above will lead to the same result as your existing code, but requires an extra temporary variable, and in the latter snippet copying of the structure twice.