2012-05-26 26 views
6

Jestem całkiem nowy w C i mam pewne problemy ze wszystkimi wskaźnikami.typedef struct pointer definition

Napisałem ten kod:

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; 

pojawia się błąd ten sposób i po prostu nie mogę zrozumieć, dlaczego.

Wiem, że edgeitem i edge są znacznikami i mogę używać struct edge *next, ale zadeklarowałem wskaźniki, więc dlaczego nie mogę ich użyć?

Czy muszę użyć *, jeśli mam wskaźnik?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

Nie mogę zrozumieć, to wskaźnik, dlaczego więc dodaję *?

I ostatnie pytanie brzmi: Jeśli używam powyższego, jaka jest różnica pomiędzy:

*EDGE next 
EDGE *next 

i ostatni: jeśli Dodaję:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

jest to samo co:

pEDGE  head; 
+5

Powszechnie uważa się, że zły styl polega na ukrywaniu "*" za typedef. Może tylko doprowadzić do zamieszania. Programiści czytają * coś szybciej niż pThing. To samo dotyczy innych elementów składni, takich jak '#define AND &&', et cetera. W skrócie: nie rób tego. – wildplasser

Odpowiedz

10

Nie można używać PEDGE w ramach definicji jon struktury. Powinni zrobić coś takiego:

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

Należy również pamiętać, że edge_item jest podwójny wskaźnik. Wspomniasz o tym również w swoim pytaniu. Więc jeśli używasz pEDGE_ITEM i chcesz mieć normalny wskaźnik, nie powinieneś pisać: pEDGE_ITEM *edge_item, ale tylko pEDGE_ITEM edge_item.

Dla wyjaśnienia, wszystkie poniższe oświadczenia są równoważne:

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

Ale

pEDGE_ITEM *edge_item; 

jest równoważna

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

O *EDGE next że jest źle składnia. Poprawna składnia to EDGE* next lub pEDGE next. Tak więc po zdefiniowaniu struct edge możesz po prostu użyć dowolnego z tych dwóch elementów, ale podczas definiowania struktury musisz zrobić to, co pokazuję na początku mojej odpowiedzi.

Tak, dwa następujące definicje są równoważne:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

Widziałem, że w obu odpowiedziach, które napisałeś, aby użyć "struct edge", jak to się stało, że jest to poprawne, podczas gdy pEdge nie jest? to też jest niezdefiniowane? – user1386966

+0

ponieważ nie można użyć ani 'EDGE' ani' pEDGE' typedefs dopóki struktura nie zostanie w pełni zdefiniowana. Kiedy już jest, możesz swobodnie używać typedef zamiast używać dłuższego 'struct edge' lub' struct edge * '. – betabandido

+0

dziękuję bardzo !!! – user1386966

2

Używasz typu alias zanim zostanie zdefiniowany. Korzystanie tag struktura jest obejście:

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

pamiętać, że prawie na pewno używane aliasy wskaźnika nieprawidłowo, unikałem ich.

0

Myślę, że to powinno działać dobrze.

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;