PS:VOID指针确实比较难以理解。。。。
问题,关于邮箱发送消息和接收消息函数中使用的空类型指针void*
两个函数的定义是这样的:
ERercd= tk_snd_mbx(IDmbxid,T_MSG*pk_msg);
ERercd= tk_rcv_mbx(IDmbxid,T_MSG**ppk_msg,TMOtmout);
其中T_MSG的定义如下:
typedef struct t_msg {
VP msgque[1]; /* Area for message queue */
} T_MSG;
其中VP就是 typedef void *VP;
也就是说,T_MSG这个结构本身包含了一个空类型的指针
下面是我对这里使用空类型指针的理解,求鉴定。
先明确的地方:消息传递中,传递的只是地址。
1、tk_snd_mbx使用T_MSG*
T_MSG* 是指向消息结构的指针,与msgque是相同的。这个指针是一个void*类型的指针。可以指向任意类型的数据。
所以tk_snd_mbx(IDmbxid,T_MSG*pk_msg);
这种用法,就是要向函数传递一个空类型的指针。
2、tk_rcv_mbx中的使用。
这里是一个指向指针的指针(T_MSG** ppk_msg)。关于ppk_msg内核规范中有这么个说明:ppk_msg是包含消息的数据包(包括消息头在内)的起始地址。
也就是说ppk_msg是一个地址(地址1)。* ppk_msg是就是地址中的数据,这个数据也是个地址(地址2)。于是T_MSG** ppk_msg 就是地址2中存储的数据。这个数据是T_MSG类型的。(不知对错,求鉴定)
在示例工程中,有这么个用法:
tk_rcv_mbx(MbxID_S,(T_MSG**)&pk_rcvmsg,-1);
其中pk_rcvmsg 的定义是这样的:U_MSG *pk_rcvmsg; 也是个指针。
那么&pk_rcvmsg,就是取这个指针的地址。(T_MSG**)&pk_rcvmsg就成了将地址pk_rcvmsg中存储的地址所指向的数据块,强制转换成T_MSG*类型。
刚好与函数定义部分相同。