1

私は 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 に答える 4

4
  1. p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->someField
  2. 変わりはない。

PS。そのコードは本当に、本当に醜いです。

于 2012-02-20T18:57:08.773 に答える
2
ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable; 

ZPS_tsAplApsmeBindingTable *psAplApsmeBindingTable; 

ZPS_tsAplApsmeBindingTable * psAplApsmeBindingTable; 

同じです。の場所は*何も変わりません。


ポインター (ポインターなどp) が指す構造体の値にアクセスするには、矢印を使用できます。->

p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u16ClusterId
于 2012-02-20T18:59:34.563 に答える
1

ZPS_tsAplApsmeBindingTableType *p; を宣言しました。しかし、私は ZPS_tsAplApsmeBindingTableEntry 構造値にアクセスしたい...どうすればそれを行うことができますか??

まあ、あなたはできません。あなたのコードでは、タイプorZPS_tsAplApsmeBindingTableTypeのメンバーが a に含まれていません。ZPS_tsAplApsmeBindingTableEntryZPS_tsAplApsmeBindingTableEntry*

ZPS_tsAplApsmeBindingTable* psAplApsmeBindingTable と ZPS_tsAplApsmeBindingTable *psAplApsmeBindingTable; の違いを教えてください。

違いはありません; それらは同じものです...文字通り同じテキストが2回コピーされました。あなたの質問がよくわかりません。もう少し詳しく教えていただければ、さらにお役に立てるかもしれません。

于 2012-02-20T18:55:49.203 に答える
0

次のようにZPS_tsAplApsmeBindingTableEntryメンバーにアクセスします。

p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->uDstAddress
p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u16ClusterId
p->psAplApsmeBindingTable->pvAplApsmeBindingTableEntryForSpSrcAddr->u8DstAddrMode

、 、およびはすべて構造体型へのポインターである->ためp、すべての選択に を使用します。それらのいずれかがポインター型でない場合は、演算子を使用してその型のコンポーネント選択を行っていたでしょう。例えば:psAplApsmeBindingTablepvAplApsmeBindingTableEntryForSpSrcAddr.

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;

どちらも、型指定子ではなく、常にdeclaratorT (*p);の一部として解釈されます。あなたが書いた場合*

T* a, b;

へのポインタとしてのみa宣言されますTbプレーンとして宣言されますT

于 2012-02-20T20:13:27.703 に答える