2012-02-20 2 views
1

Я работаю над встроенным C. Я застрял со структурой указателя ....Застревание с указателем 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; 

Спасибо ....

+3

Я застрял на ваших соглашениях об именах! Вау. – Duck

ответ

4
  1. p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->someField
  2. Нет разницы.

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

+0

, когда я использую это, он создает незаконное выравнивание адреса .. .. –

+0

и я думаю, что ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable - это массив структуры ... если я использую psAplApsmeBindingTable [0] .someval или psAplApsmeBindingTable-> someptr, он показывает недопустимое выравнивание адреса –

1

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

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

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

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

+0

Предположим, что массив структуры указан указателем структуры ZPS_tsAtsApsmeBindingTable * psAplApsmeBindingTable его указатель структуры .... Я хочу получить доступ к этим значениям в этом местоположении ... –

2
ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable; 

и

ZPS_tsAplApsmeBindingTable *psAplApsmeBindingTable; 

и

ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable; 

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


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

p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u16ClusterId 
+0

, но сэр это показывает мне ошибку .. ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable массив структуры, на который указывает psAplApsmeBindingTable .. если я использую p-> psAplApsmeBindingTable [0] .u64SourceAddress снова его показать ошибку .. предложите способ ее решить .. –

+0

вы пробовали 'p-> psAplApsmeBindingTable [0] - > u64SourceAddress '? –

0

Вы бы добраться до 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.

Смежные вопросы