2012-05-26 23 views
6

Sono abbastanza nuovo in C e ho qualche problema con tutte le cose del puntatore.typedef struct pointer definition

ho scritto questo codice:

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; 

ottengo un errore in questo modo e solo riesco a capire perché.

So che edgeitem e edge sono tag e posso usare struct edge *next ma ho dichiarato i puntatori quindi come mai non posso usarli?

Devo usare * se ho un puntatore?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

Non capisco, è un puntatore, quindi perché devo aggiungere il *?

E l'ultima domanda è: Se sto usando quanto sopra, qual è la differenza tra:

*EDGE next 
EDGE *next 

e ultimo: se sto aggiungendo:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

è è lo stesso di:

pEDGE  head; 
+5

Generalmente è considerato uno cattivo stile nascondere un '*' dietro un typedef. Può solo portare a confusione. I programmatori leggono * cosa più velocemente di pThing. Lo stesso vale per altri elementi di sintassi, come '#define AND &&', eccetera. In breve: non farlo. – wildplasser

risposta

10

Non è possibile utilizzare pEDGE all'interno del gruppo ione della struttura. Si shoud fare qualcosa di simile:

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

Si deve anche notare che edge_item è un doppio puntatore. Lo menzioni anche nella tua domanda. Quindi se usi pEDGE_ITEM e vuoi semplicemente avere un puntatore normale, non dovresti scrivere pEDGE_ITEM *edge_item ma solo pEDGE_ITEM edge_item.

Per chiarire, tutte le seguenti dichiarazioni sono equivalenti:

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

Ma

pEDGE_ITEM *edge_item; 

è equivalente a

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

Chi *EDGE next che è la sintassi sbagliata. La sintassi corretta sarebbe EDGE* next o pEDGE next. Quindi, una volta definito struct edge, è possibile utilizzare solo uno di questi due, ma mentre si definisce la struttura, è necessario farlo come illustrato all'inizio della risposta.

Sì, le seguenti due definizioni sono equivalenti:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

Ho visto che in entrambe le risposte hai scritto di usare "struct edge", come mai questo è corretto mentre pEdge non lo è? anche questo è indefinito? – user1386966

+0

perché non è possibile utilizzare né typedefs 'EDGE' né' pEDGE' finché la struttura non è completamente definita. Una volta che è, puoi usare liberamente i typedef invece di usare il 'struct edge' o' struct edge * '. – betabandido

+0

grazie mille !!! – user1386966

2

Si sta utilizzando un tipo alias prima che venga definita. Utilizzando il tag struttura è una soluzione:

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

Si noti che è quasi sicuramente utilizzato gli alias puntatore in modo non corretto, li ho evitato.

0

Penso che questo dovrebbe funzionare bene.

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;