2014-10-08 3 views
4

Учитывая следующую декларацию STRUCT:Является ли это указателем на указатель?

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

+1

lol @ Спасибо, должен ли я просто удалить вопрос, потому что он настолько очевиден или вы хотите опубликовать ответ? Еще раз спасибо, просто хотел быть уверенным, что я не схожу с ума. –

+2

Да, вы должны удалить его. На самом деле нет смысла отвечать на этот вопрос вне комментария, сделанного @Angew. –

ответ

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 обычно используется, чтобы избежать ненужной многословности.

+0

Нет смысла отвечать на этот вопрос вне комментария, уже сделанного @Angew. –

+0

@barakmanos Есть побочный сигнал, который может быть не очевиден. –

+0

Я понимаю, что вы не собираетесь удалять этот ответ после голосования, тем не менее, весь вопрос лишний после ответа «Да». –

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; 

может быть разделен на две декларации 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 
Смежные вопросы