Вы получите ZPS_tsAplApsmeBindingTableEntry
участников следующим образом:
p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->uDstAddress
p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u16ClusterId
p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u8DstAddrMode
и т.д.. Вы должны использовать ->
для всех выборов, потому что p
, psAplApsmeBindingTable
и pvAplApsmeBindingTableEntryForSpSrcAddr
являются указателями на типы структур. Если бы у любого из них были , а не типы указателей, вы бы использовали оператор .
для выбора компонентов для этого типа. Например:
struct a {int x; int y};
struct b {struct a *p; struct a v};
struct b foo, *bar = &foo;
...
foo.p->x = ...; // foo is not a pointer type, p is a pointer type
bar->v.y = ...; // bar is a pointer type, v is not a pointer type
Выражение x->y
является сокращением для (*x).y
; IOW, вы разыменовываете x
и затем выбираете y
.
Нет разницы между декларациями
T *p;
и
T* p;
Оба интерпретируются как T (*p);
- *
всегда является частью декларатора , а не спецификатором типа. Если вы написали
T* a, b;
только a
будет объявлено как указатель на T
; b
будет объявлено как простой T
.