C 指针引用混合'*';和'-&燃气轮机';语法混乱

C 指针引用混合'*';和'-&燃气轮机';语法混乱,c,pointers,syntax,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 retur

我不是一个专业的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\u int16\t(packet->payload,0)
packet->payload
指针引用的数据拆分为8位部分,并返回前8位(由于
+0

这是我试图保留的nDPI库的单个部分中的一个示例

[注]

是一个函数,它以主机字节顺序(大多数机器上为小端,大端机器上为大端)获取
字(16位),并将其转换为网络字节顺序的
字(始终为大端)。在这种情况下,
数据包->有效载荷
(感谢AndreyT!)的偏移量0处的
将返回一个大端的
,因此ntop开发人员决定使用
htons()
转换给定值(在这种情况下,是一个字节模式,用于确定流是否符合Apple归档协议)这是网络堆栈的小端到大端

[更多]


我提出的建议可能对将来处理类似情况的人有用。

你是对的,但不是完全正确

u\u int8\t
类型用作寻址单元。它基本上是一个“字节”。那么

part只选择从
X
指向的内存块开始的字节偏移量
O
处的位置。这就是
u\u int8\t
type的角色结束的地方

然后
*(u\u int16\u t*)
部分将该内存位置解释为无符号16位字

所以,除了宏“返回”一个存储在地址
X+O
的16位值(不是8位值)之外,一切都正常。在您的特定示例中,宏用于读取存储在内存块
数据包->有效负载
最开始(偏移量
0
)处存储的无符号16位值

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

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

42
写入内存块最开始处的16位字
数据包->有效载荷

非常好的、容易理解的答案!非常感谢!
get_u_int16_t(packet->payload, 0) = 42;