6

私はCの初心者で、すべてのポインターに問題があります。

私はこのコードを書きました:

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

そして最後のもの:私が追加している場合:

typedef struct edge_list
{
    EDGE        *head;
}EDGE_LIST;

と同じですか:

pEDGE      head;
4

3 に答える 3

10

構造体の定義内で pEDGE を使用することはできません。あなたは次のようなことをすべきです:

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_itempEDGE_ITEM edge_item.

明確にするために、次の宣言はすべて同等です。

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

しかし

pEDGE_ITEM *edge_item;

と同等です

struct edgeitem **edge_item;
EDGE_ITEM **edge_item;

それについて*EDGE nextは間違った構文です。正しい構文はEDGE* nextorpEDGE nextです。したがって、一度struct edge定義すると、これら2つのいずれかを使用できますが、構造体を定義している間は、回答の冒頭で示したようにする必要があります.

はい、次の 2 つの定義は同等です。

typedef struct edge_list {
    EDGE        *head;
} EDGE_LIST;

typedef struct edge_list {
    pEDGE        head;
} EDGE_LIST;
于 2012-05-26T19:10:55.950 に答える
2

定義する前に型エイリアスを使用しています。構造タグを使用すると回避できます。

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

ほぼ確実にポインターエイリアスを間違って使用していることに注意してください。私はそれらを避けました。

于 2012-05-26T19:12:01.213 に答える
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;
于 2014-01-20T20:45:44.547 に答える