Понимание-указатель на структуру - PullRequest
3 голосов
/ 16 апреля 2020

Я хочу понять, как указатель на структуру передается в аргумент функции и реализуется. Как работает 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);
}

Ответы [ 2 ]

4 голосов
/ 16 апреля 2020

Несколько моментов, которые могут помочь вам понять массивы и указатели и их взаимосвязь:

  • Указатель действительно указывает только на один «объект», но этот объект может быть первым в массив.

  • Массивы естественным образом распадаются на указатели на их первый элемент.

  • И индексация массива эквивалентна арифметике указателей c (для любого указатель или массив a и индекс i, выражение a[i] точно равно *(a + i)).


Что касается указанного вами примера кода c возможно, было бы проще, если бы вы думали об этом, как это:

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;

Оба приведенных выше фрагмента приведут к тому же результату, что и ваш существующий код, но требуется дополнительная временная переменная, а в последнем фрагменте копирование структуры дважды.

0 голосов
/ 16 апреля 2020

avrg_stpc рассматривается как массив (возможно, выделенный в куче через .*alloc); поскольку его границы не могут быть известны, следовательно, второй аргумент функции. Смотрите здесь: https://en.cppreference.com/w/c/language/operator_member_access

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...