2012-05-26 8 views
6

私はC言語では新しく、すべてのポインタの問題にいくつかの問題があります。typedef structポインタ定義

私はこのコードを書いた:

typedef struct edgeitem 
{ 
    double   weight; 
}EDGE_ITEM, *pEDGE_ITEM; //also declaration of a pointer 

/************ edge that includes a pointer to the edge item, next and prev ******/ 
typedef struct edge 
{ 
    pEDGE_ITEM *edge_item; 
    pEDGE  *next;  //pointer to next edge 
    pEDGE  *prev;  //pointer to prev edge 
}EDGE, *pEDGE; 

私はエラーをこのように取得し、ちょうどカントは、理由を理解します。

edgeitemedgeはタグで、私はstruct edge *nextを使うことができますが、どうして私はそれらを使用できないのですか?

ポインタがある場合は*を使用する必要がありますか?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

私は理解できません。それはポインタなので、なぜ*を追加しますか?

そして最後の質問です: 私は違い何、上記を使用している場合:

*EDGE next 
EDGE *next 

と最後の1: 私は追加している場合:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

をされますそれと同じ:

+5

typedefの後ろに '*'を隠すことは、一般的には悪いスタイルです。それは混乱につながるだけです。プログラマは*事をpThingよりも速く読みます。同じことが '#define AND &&'などの他の構文要素にも当てはまります。つまり、しないでください。 – wildplasser

答えて

10

あなたはdefinite内でpEDGEを使用することはできません構造体のイオン。あなたが好きな何かをshoud:

typedef struct edge { 
    pEDGE_ITEM   *edge_item; 
    struct edge   *next;  //pointer to next edge 
    struct edge   *prev;  //pointer to prev edge 
} EDGE, *pEDGE; 

またedge_itemがダブルポインタであることに注意しなければなりません。あなたはまたあなたの質問に言及します。したがって、pEDGE_ITEMを使用し、通常のポインタを使用したい場合は、pEDGE_ITEM *edge_itemと書くべきではなく、ただpEDGE_ITEM edge_itemと書くべきです。

明確にするために、以下のすべての宣言は等価です:

struct edgeitem *edge_item; 
EDGE_ITEM *edge_item; 
pEDGE_ITEM edge_item; 

しかし

pEDGE_ITEM *edge_item; 

は間違っ構文であること*EDGE nextについて

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

に相当します。正しい構文はEDGE* nextまたはpEDGE nextです。したがって、struct edgeが定義されている場合は、これらの2つのうちのいずれかを使用することができますが、構造体を定義する際には、私が答えの冒頭に示すようにしなければなりません。

はい、次の二つの定義は等価である:それが定義される前に

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

typedef struct edge_list { 
    pEDGE  head; 
} EDGE_LIST; 
+0

私は両方の答えで "struct edge"を使用すると書いていましたが、pEdgeは正しくありません。これも未定義ですか? – user1386966

+0

構造体が完全に定義されるまで、 'EDGE'型と' pEDGE'型のどちらの型も使用できないためです。それが終わったら、より長い 'struct edge'や' struct edge * 'を使う代わりに自由にtypedefを使うことができます。 – betabandido

+0

ありがとうございます! – user1386966

2

あなたはタイプの別名を使用しています。構造タグを使用すると回避策です:あなたは、ほぼ確実に間違ってポインタのエイリアスを使用し、私はそれらを避け

typedef struct edge 
{ 
    EDGE_ITEM *edge_item; 
    struct edge *next;  //pointer to next edge 
    struct edge *prev;  //pointer to prev edge 
} EDGE; 

注意。

0

これはうまくいくはずです。

typedef struct edgeitem 
    { 
     double   weight; 
    }EDGE_ITEM, *pEDGE_ITEM; //also declaration of a pointer 

    /************ edge that includes a pointer to the edge item, next and prev ******/ 
    typedef struct edge *pEDGE; //<<------- this 
    typedef struct edge 
    { 
     pEDGE_ITEM *edge_item; 
     pEDGE  *next;  //pointer to next edge 
     pEDGE  *prev;  //pointer to prev edge 
    }EDGE; 
関連する問題