具体代码如下
static lv_mem_ent_t * ent_get_next(lv_mem_ent_t * act_e)
{
lv_mem_ent_t * next_e = NULL;
if(act_e == NULL) { /*NULL means: get the first entry*/
next_e = (lv_mem_ent_t *)work_mem;
}
else { /*Get the next entry */
uint8_t * data = &act_e->first_data;
next_e = (lv_mem_ent_t *)&data[act_e->header.s.d_size];
if(&next_e->first_data >= &work_mem[LV_MEM_SIZE]) next_e = NULL;
}
return next_e;
}
//--------------------------------------------------------------------------------------------------
其中 lv_mem_ent_t 定义如下
typedef union {
struct {
MEM_UNIT used : 1; /* 1: if the entry is used*/
MEM_UNIT d_size : 31; /* Size of the data*/
} s;
MEM_UNIT header; /* The header (used + d_size)*/
} lv_mem_header_t;
typedef struct {
lv_mem_header_t header;
uint8_t first_data; /*First data byte in the allocated data (Just for easily create a pointer)*/
} lv_mem_ent_t;
//-------------------------------------------------------------------------------------------------------------
关于 work_mem的定义如下
static uint8_t * work_mem;
//-------------------------------------------------------------------------------------------------------------
我的具体问题如下
1.work_mem为uint8_t指针类型,lv_mem_ent_t为不同类型指针(为复合union结构指针)
当执行next_e = (lv_mem_ent_t *)work_mem;(nex_e为lv_mem_ent_t指针)
那么work_mem是如何转变成lv_mem_ent_t指针的,多说指针多是固定32位,转换后work_mem
转变成什么了呢,指向lv_men_ent_t的头一个成员变量地址吗?
2. uint8_t * data = &act_e->first_data; //定义一个uint8_t指针data,并把act_e->first_data的地址去
给data,这样的理解没问题吧?
3.next_e = (lv_mem_ent_t *)&data[act_e->header.s.d_size];
3.1data为uint8_t指针变量且第二个问题中把act_e->frist_data地址已经给了data,
而现在 (lv_mem_ent_t *)&。作用是强制转换取得的地址吗?
3.2整个句子是怎么顺序呢,其中有多个单目运算符,有的是从左往右,有的相反这里有什么好的技巧
方法可以指教下小白本人吗?
3.3 data[act_e->header.s.d_size],data不管作为uint8_t还是被强制转换成lv_mem_ent_t 指针
多是单一指针,而现在加了[]是不是变成指针数组了?
4. if(&next_e->first_data >= &work_mem[LV_MEM_SIZE])
&next_e->first_data以及&work_mem这两个多是取地址吗?那这里是在比较地址大小吗?如果比较的是地址大小有意义吗?
|