Is this a pointer to a pointer?

Given the following structure declaration:

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" is declared at the end, I have never seen this before. It looks like this is just a pointer type declaration for the WINDIVERT_IPHDR structure. Is my assumption correct? If so, will this code be:

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..in particular, does it mean that the parameter of the "ppIpHdr" method is actually a pointer to a pointer?

+4
source share
2 answers

Yes, this pointer type, as in the following snippet:

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 , .

+6

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
+4

All Articles