打印
[技术讨论]

关于c语言指针应用的一些疑问

[复制链接]
321|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XLDZZ|  楼主 | 2021-2-28 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
具体代码如下
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这两个多是取地址吗?那这里是在比较地址大小吗?如果比较的是地址大小有意义吗?

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

182

帖子

0

粉丝