理解指向结构体的指针

3

我希望了解指向结构体的指针如何作为函数参数传递和实现。 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);
}

顺带提一下,按照前缀“avg”的含义,avg_f32可能是用于计算平均数的。而你的乘法并不会计算平均值。 - Some programmer dude
有时候看一下生成的代码会很有帮助,至少在我的情况下,通过在汇编级别逐步执行代码并查看内存中的变化,指针从一个晦涩难懂的谜团变成了完全理解。 - SoronelHaetir
2个回答

4
以下几点可能有助于您理解数组和指针及其关系:
  • 指针实际上只指向一个“对象”,但该对象可能是数组中的第一个元素。
  • 数组自然而然地衰减为指向它们的第一个元素的指针。
  • 数组索引等同于指针算术运算(对于任何指针或数组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;

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


我相信你非常熟练掌握指针算术运算,但为了楼主的利益,第三点可能需要进一步解释。指针算术运算按指向的东西的大小递增进行,因此如果你有一个类型为“avgminmax_avg_t *”的指针a,那么aa + 1所指地址之间的差异是sizeof(avgminmax_avg_t) - Caleb
是的,我理解这两个代码片段,并且我期望使用“->”来访问结构体成员,但仍然不明白 avrg_stpc[0].sum_f32、avrg_stpc[1].sum_f32 等的含义。 - litun bls
@litunbls,所以问题实际上是为什么需要使用 . 成员访问运算符而不是 ->?这是因为使用 [] 进行数组索引已经取消了指针的引用,avrg_stpc[idx_u16] 不是指向结构体的指针,而是一个需要使用 . 访问其成员的结构体 对象 - Some programmer dude
在我看来,该函数接受结构体指针数组作为参数。应该像这样使用 "[ ]": "void avgminmax_AvgCalculate_vd(avgminmax_avg_t * const avrg_stpc[ ], const unsigned int numOfEntrys_u16c)"。 - litun bls
@litunbls 如果你已经读过一些不错的C编程入门书籍,那么它应该告诉你,在参数声明中,声明一个数组与声明一个指针是完全相同的。对于一个参数来说,avgminmax_avg_t avrg_stpc[]avgminmax_avg_t *avrg_stpc 是一模一样的。而 avgminmax_avg_t *avrg_stpc[] 则表示一个指针数组,其真实类型为 avgminmax_avg_t **avrg_stpc。类型 avgminmax_avg_t *avrg_stpc[]avgminmax_avg_t *avrg_stpc 是非常不同的。 - Some programmer dude

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接