这是一个指向指针的指针吗?

4

考虑以下结构声明:

typedef struct
{
    UINT8  HdrLength:4;
    UINT8  Version:4;
    UINT8  TOS;
    UINT16 Length;
    UINT16 Id;
    UINT16 FragOff0;
    UINT8  TTL;
    UINT8  Protocol;
    UINT16 Checksum;
    UINT32 SrcAddr;
    UINT32 DstAddr;
} WINDIVERT_IPHDR, *PWINDIVERT_IPHDR;

在末尾声明了“*PWINDIVERT_IPHDR”,我以前从未见过这种写法。看起来它只是一个指向WINDIVERT_IPHDR结构体的指针类型声明。我的假设是正确的吗?如果是,那么这段代码:

extern BOOL WinDivertHelperParsePacket(PVOID pPacket, UINT packetLen,
    PWINDIVERT_IPHDR *ppIpHdr, PWINDIVERT_IPV6HDR *ppIpv6Hdr,
    PWINDIVERT_ICMPHDR *ppIcmpHdr, PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr,
    PWINDIVERT_TCPHDR *ppTcpHdr, PWINDIVERT_UDPHDR *ppUdpHdr, PVOID *ppData,
    UINT *pDataLen)

具体来说,PWINDIVERT_IPHDR *ppIpHdr 是指方法参数 "ppIpHdr" 实际上是一个指向指针的指针吗?


8
没错,这就是为什么它的名字以“pp”开头的原因。 - Angew is no longer proud of SO
1
笑 @Angew 谢谢,我是应该删除这个问题,因为它太显而易见了,还是你愿意发表一个答案?再次感谢,只是想确定我没有疯掉。 - user562566
2
是的,你应该删除它。除了@Angew所做的评论外,回答这个问题真的没有意义。 - barak manos
3
评论不是答案,虽然这个问题很基础,但我认为它应该有一个适当的答案(我在写评论时没有时间发布)。我认为没有删除的理由。 - Angew is no longer proud of SO
2个回答

6

没错,这是一个指针类型,就像下面的代码片段中所示:

typedef struct A {
    int val;
} type, *type_ptr;

int main(int argc, const char *argv[]) {

  type obj;
  obj.val = 42;
  type_ptr ptr = &obj;
  std::cout << ptr->val; // 42

  return 0;
}

作为附注:在C语言中,声明对象或指向该对象的指针时,总是需要在前面加上struct关键字。这种typedef语法通常用于避免不必要的冗长。

除了@Angew已经发表的评论外,实际上回答这个问题没有任何意义。 - barak manos
如果这真的让你很烦,我可以删除它。尽管我不是那种追求声望的农民,但我相信我添加了一点点东西。 - Marco A.
1
我要放弃这个问题,因为正是发生了这种情况。我讨厌在这里问C/C++的问题,就是因为这个原因。回答就像是“这是一个如此简单的问题,你甚至问它太蠢了”。好吧,从我的问题中可以看出来,我只是想确定我的假设是正确的。但是可能有人完全不知道。这是一个有效的问题。 - user562566
1
@TechnikEmpire 我同意,而且谷歌可能会认为搜索这些关键词的人也是这样想的。 - Marco A.
2
@barakmanos 好的,一切都很好,和平、爱和善意向人类。感谢大家的贡献。 - user562566
显示剩余2条评论

4
这个typedef声明
typedef struct
{
    UINT8  HdrLength:4;
    UINT8  Version:4;
    UINT8  TOS;
    UINT16 Length;
    UINT16 Id;
    UINT16 FragOff0;
    UINT8  TTL;
    UINT8  Protocol;
    UINT16 Checksum;
    UINT32 SrcAddr;
    UINT32 DstAddr;
} WINDIVERT_IPHDR, *PWINDIVERT_IPHDR;

可能会分成两个typedef声明

typedef struct
{
    UINT8  HdrLength:4;
    UINT8  Version:4;
    UINT8  TOS;
    UINT16 Length;
    UINT16 Id;
    UINT16 FragOff0;
    UINT8  TTL;
    UINT8  Protocol;
    UINT16 Checksum;
    UINT32 SrcAddr;
    UINT32 DstAddr;
} WINDIVERT_IPHDR;

typedef WINDIVERT_IPHDR *PWINDIVERT_IPHDR;

因此参数声明
PWINDIVERT_UDPHDR *ppUdpHdr

等同于

WINDIVERT_IPHDR * *ppUdpHdr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接