指针混合'*'和' - >'语法混乱

时间:2013-07-12 16:33:11

标签: c pointers syntax

我不是通过交易的C开发人员...说实话,我不是交易开发者,所以我使用的术语可能不正确。

我花了大约一小时左右阅读define语句,然后阅读pointer个引用,并对以下实例感到困惑。

假设:

#define get_u_int16_t (X,O)  (*(u_int16_t *)(((u_int8_t *)X) + O))

if (get_u_int16_t(packet->payload, 0) == htons(0x0004)) {
//do something
return;
}

这是否意味着get_u_int16_t(packet->payload, 0)packet->payload指针引用的数据拆分为8位部分,并返回前8位(由于+ 0)?

这是我尝试保留的{nQI库的一部分afp.c中的一个示例。

[注]

htons()是一个以主机字节顺序为word(16位)的函数(大多数机器上的小端,或大端机器上的大端)并将其转换为{{1网络字节顺序(总是大端)。在这种情况下,word偏移0 word(感谢AndreyT!)将返回大端的packet->payload,因此ntop开发人员决定使用word进行转换一个给定的值(在这种情况下是一个字节模式,确定一个流是Apple文件协议),它是网络堆栈大端的小端。

[详细]

我已经移动了some questions to a forum that is more conducive to fuzzy questions to have some technicalities understood,这可能对将来处理类似情况的人有用。

1 个答案:

答案 0 :(得分:2)

你是对的,但不是完全的。

u_int8_t类型用作寻址单元。它基本上是一个“字节”。所以

((u_int8_t *)X) + O)

部分只是从O指向的内存块的开头选择字节偏移量X处的位置。这就是u_int8_t类型的角色结束的地方。

然后*(u_int16_t *)部分将该存储器位置解释为无符号的16位字。

所以,除了宏“返回”存储在地址X + O的16位值(不是8位值)之外,你得到了一切。在您的具体示例中,宏用于读取存储块0的最开始(偏移packet->payload)存储的无符号16位值。

请注意,以这种方式编写的宏的计算结果为 lvalue ,这意味着它也可用于在给定的特定字节偏移量中写入 16位数据内存块,例如

get_u_int16_t(packet->payload, 0) = 42;

会将42写入驻留在内存块packet->payload最开头的16位字中。