застрять с указателем C Структура - PullRequest
1 голос
/ 20 февраля 2012

Я работаю над Embedded C.Я застрял с указателем структуры ....

Структуры приведены ниже ..

/*structure 1*/
ZPS_tsAplApsmeBindingTableType *psAplApsmeAibBindingTable;

/*structure 2*/
typedef struct
{
    ZPS_tsAplApsmeBindingTableCache* psAplApsmeBindingTableCache;
    ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable;
}ZPS_tsAplApsmeBindingTableType;

/*structure3*/
typedef struct
{
   uint64  u64SourceAddress;
   ZPS_tsAplApsmeBindingTableEntry* pvAplApsmeBindingTableEntryForSpSrcAddr;
   uint32 u32SizeOfBindingTable;
}ZPS_tsAplApsmeBindingTable;

/*structure 4*/
typedef struct
{
   ZPS_tuAddress  uDstAddress;
   uint16  u16ClusterId;
   uint8   u8DstAddrMode;
   uint8   u8SourceEndpoint;
   uint8   u8DestinationEndPoint;
} ZPS_tsAplApsmeBindingTableEntry;

Я объявил ZPS_tsAplApsmeBindingTableType *p;, но я хочу получить доступ к ZPS_tsAplApsmeBindingTableEntry значениям структуры ...Как я мог это сделать ??

Может кто-нибудь сказать мне разницу между

ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable

и

ZPS_tsAplApsmeBindingTable *psAplApsmeBindingTable;

Спасибо ....

Ответы [ 4 ]

4 голосов
/ 20 февраля 2012
  1. p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->someField
  2. Без разницы.

PS. Этот код действительно очень уродливый.

2 голосов
/ 20 февраля 2012
ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable; 

и

ZPS_tsAplApsmeBindingTable *psAplApsmeBindingTable; 

и

ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable; 

одинаковы .Расположение * ничего не меняет.


Чтобы получить доступ к значениям структуры, на которую указывает указатель (например, указатель p), вы можете использовать стрелку ->

p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u16ClusterId
1 голос
/ 20 февраля 2012

Я объявил ZPS_tsAplApsmeBindingTableType * p; но я хочу получить доступ к значениям структуры ZPS_tsAplApsmeBindingTableEntry ... Как я могу это сделать ??

Ну, ты не можешь. В вашем коде ZPS_tsAplApsmeBindingTableType не содержится членов типа ZPS_tsAplApsmeBindingTableEntry или ZPS_tsAplApsmeBindingTableEntry*.

Может кто-нибудь сказать мне разницу между ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable и ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable;

Нет разницы; это одно и то же ... буквально один и тот же текст, скопированный дважды. Я не очень понимаю ваш вопрос. Если бы вы могли уточнить, я мог бы помочь в дальнейшем.

0 голосов
/ 21 февраля 2012

Вы получите 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.

...