void *指针的妙用

发布者:创新火箭最新更新时间:2015-05-05 来源: 51hei关键字:void  指针 手机看文章 扫描二维码
随时随地手机看文章
在阅读源码的过程中,我发现很多的代码中都采用了链表,链表的也是非常有意义的一种。有我们在C语言中使用的那种数据嵌套指针的方式。也有在linux中将链表作为一个单独的对象,然后将这个对象嵌入到不同的对象中,然后根据container_of()得到对应的对象指针。这些方式都是常用的方式之一。

在看uC/OS-II中我阅读源码时发现其中竟然很少有关于链表的操作。开始也没有仔细的去分析原因,我甚至认为位图的方式取代了链表。因为uC/OS-II基本上可以任务是基于数组等静态内存分布的方式,全局变量的形式可以通过位图简单的链接在一起。
但是在阅读事件标志组的过程中我发现其中还是存在很多关于链表的操作的,比如很多的如何将事件标志节点链接起来,但是分析源码并没有

 

    typedef struct {                            /* Event Flag Wait List Node */
        void *OSFlagNodeNext; /* Pointer to next NODE in wait list */
        void *OSFlagNodePrev; /* Pointer to previous NODE in wait list */
        void *OSFlagNodeTCB; /* Pointer to TCB of waiting task */
        void *OSFlagNodeFlagGrp; /* Pointer to Event Flag Group */
        OS_FLAGS OSFlagNodeFlags; /* Event flag to wait on */
        INT8U OSFlagNodeWaitType; /* Type of wait: */
                                                /* OS_FLAG_WAIT_AND */
                                                /* OS_FLAG_WAIT_ALL */
                                                /* OS_FLAG_WAIT_OR */
                                                /* OS_FLAG_WAIT_ANY */
    } OS_FLAG_NODE;
    #endif

从上面的代码可以发现并没有使用OS_FLAG_NODE的指针形式,而是采用了void *的指针形式,结合具体的实现过程我发现这样的定义方式确实相比我们之前传统的定义方式存在很多的优点,首先这种连接方式比传统的链接方式更加的灵活多变,并一定指向的内容就是自己定义的这种结构体,因为void *这种全能的指针形式扩大了对不同类型的链接能力,使得链表的优势更加的明显。

 

    pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
        pnode->OSFlagNodePrev = (void *)0;
        pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
        pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
        if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
            pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
        }
        pgrp->OSFlagWaitList = (void *)pnode;

上面是我从源码中复制出来的部分代码其中就有这种链表的操作方式,可以发现这种void*的类型扩大了链接对象的范围。但同样需要注意的时,在编写代码的过程中需要强制类型转换,也就是链接到链表中时需要转换为void *类型,而当弹出链表以后又需要转换成数据本身的结构类型,这可能导致一些问题的产生。但是void *类型的指针确实能够实现不同对象之间的链接关系。这就类似于在linux中的嵌入式链表非常的类似。
强制类型转换是在使用void *时特别注意的事项。

关键字:void  指针 引用地址:void *指针的妙用

上一篇:马踏棋盘的实现
下一篇:UC/OS-II的最高优先级别查找方法分析

推荐阅读最新更新时间:2024-03-16 14:00

指针万用表有哪些功能
  1、测量电阻   应将万用表的转换开关置于电阻挡(n挡)的适当量程。MF-47型万用表和500型万用表均有Rx1Ω、R×lOΩ、R×lOOΩ。R×1kΩ_和R×lOkΩ挡。   选择量程时尽量让指针在满刻度的2/3处,度数才更准确。测量大电阻时,两手不要同时接触到电阻器的两端或两表笔的金属部位,否则人体电阻会被测电阻值并联,使测量数值不准确。   在测量电阻之前,应进行奥姆调零。既将两表笔短接后,看表的指针是否指在标度盘右侧的0Ω处,若指针调不到0Ω处,则应检查表内电池的电量是否不足。   在万用表置于电阻档时,其红表笔内接电池负极,黑表笔内接电池正极。   2、测量直流电压   将转换开关置于直流电压(V)挡
[测试测量]
薄膜电容如何评测好坏 薄膜电容用错了会怎样
薄膜电容好坏检测 方法一 1.将电容器与电源接通,如果接通的瞬间万用表的指针不摆动,则说明电容器失效或断路。若表针一直指示电源电压,但是却不作摆动,表明电容器已短路。若表针摆动正常,但不返回零位,说明电容器有漏电现象。因为所指示的电压数值越高,表明漏电量越大。 2.测量容量小的电容器所用的辅助直流电压不能超过被测电容器的耐压,以免因测量而造成电容器击穿损坏。要想准确测量电容器的容量,需要采用电容电桥或Q表。上述的简易检测方法,只能粗略判断压力表电容器的好坏。 3.容量大的固定电容器可用万用表的电阻档(R×1000)测量电容器两电极,看表针的摆动情况,摆幅越大,表明电容器的电容量越大。若测试棒一直碰触电容器引线,表针应指在∞
[测试测量]
薄膜电容如何评测好坏 薄膜电容用错了会怎样
MCS-51单片机地址指针详细剖析
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令: MOVX A,@DPTR MOVX @DPTR,A MOVX A,@RI MOVX @RI,A 其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。 MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。 执行“MOVX A,@DPTR”和“MOVX @DPTR,A”指令时,在读指令代码阶段,由程序计数器(PC)提供A
[单片机]
Keil C51 中指针的使用
  指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用。   keil51的指针,包含两种指针:普通指针,兼容标准C;内存特殊指针   1 普通指针 char * ptr; //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节char * xdate ptr; //指针存储在片外,xdate 是修饰ptr的char * idate ptr; //指针存储在片内,指针指向的数据可以是片内也可以是片外   2 内存特殊指针 char xdate * ptr; //指针存储占字节不一定,根据变量存
[单片机]
Keil C51 中<font color='red'>指针</font>的使用
怎样用指针式万用表丈量沟通电压
留心:丈量时,使指针坐落满刻度的2/3处,丈量精度最高。假设不知道被测电压的规模,可先用较高的量限试测出大致数值后,再转到相应量限丈量。丈量直流电压时,黑色测验笔应接低电位点,赤色测验笔应接高电位点。
[测试测量]
如何使用指针式万用表?
(1)直流电流的测量。用万用表测量直流电流时,首先将转换开关旋到标有“mA”或“μA”的适当量程上。一般万用表的最大电流量程在1A以内,如果要测量较大电流,则必须并接分流电阻。 测量直流电流时,将黑表笔(表的负端)接到电源的负极,红表笔(表的正端)接到负载的一个端头上,负载的另一端接到电源的正极,即表头与负载串联。测量时要特别注意,由于万用表的内阻较小,切勿将两支表笔直接触及电源的两极,否则,表头将烧坏。 (2)交流电压的测量。测量前,先将转换开关旋到标有“V”处,并将开关置于适当量程挡。然后将红表笔插入万用表上标有“-”号的插孔内,黑表笔插入标有“一”号的插孔内,手握红表笔和黑表笔的绝缘部位,先用黑表笔触及一相带电体,再用红
[测试测量]
指针式压力表的检定要求
指针式压力表作为最典型的压力计量设备,在电力、化工、钢铁、制药、食品等行业具有十分广泛的应用。其在生产过程中发挥着重要的作用,有相当大的比例被应用在贸易结算、安全防护、医疗卫生及环境监测等关键领域,属于国家强制检定范畴。 指针式压力表的检定工作需依据国家检定规程 JJG 52—2013 《弹性元件式一般压力表、压力真空表和真空表》进行,检定周期通常要求不超过 6 个月。由于此类仪表不具备信号输出功能,需要通过人眼进行读数,所以常规的检定方式主要以人工操作为主,存在着负荷重、效率低、易失误、难追溯等短板。近年来,随着检测检定智能化与数字化需求的不断提升,如何通过技术改造与革新实现指针式压力表的自动化检定成为了压力计量领域的热点课
[测试测量]
指针式电测仪表自动化检定系统
  1、引言   指针式电测仪表以其价格低,可靠性高,安装、更换简便等优点在工业检测过程中被广泛使用。对电测仪表的定期检定是保证其正常工作的重要手段。但是传统的手工检定方法,过程繁琐、工作量大,存在着由于人工读数而降低了检定精度的不足。随着科技的不断进步,基于通用接口总线(General Purpose Interface Bus,GPIB)的自动检定系统代表了未来测量仪器的发展方向。GPIB 接口通过仪器之间相互通信,实现信息的共享,从而完成对被测仪表的自动综合分析和*估。利用智能仪器和GPIB组成的检定系统通常由计算机、仪器模块和应用软件三部分组成,通过软件控制操作员对被检仪表的检定顺序,避免了人为的误操作,适合于精度要求较
[测试测量]
<font color='red'>指针</font>式电测仪表自动化检定系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved