理解指针结构
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;
上面的两个代码片段都会导致与您现有代码相同的结果,但需要一个额外的临时变量,并且在后面的代码片段中复制结构两次。
我想了解如何将指向结构的指针传递给函数参数并实现。 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;
上面的两个代码片段都会导致与您现有代码相同的结果,但需要一个额外的临时变量,并且在后面的代码片段中复制结构两次。