2012-05-26 29 views
6

Soy bastante nuevo en C y tengo algunos problemas con todas las cosas del puntero.typedef struct puntero definición

de escribir este código:

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; 

consigo un error de esta manera y simplemente no puedo entender por qué.

Sé que edgeitem y edge son etiquetas y puedo usar struct edge *next pero he declarado los punteros, ¿por qué no puedo usarlos?

¿Debo utilizar * si tengo un puntero?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

No puedo entender, es un puntero, ¿por qué agrego el *?

Y la última pregunta es: Si estoy usando lo anterior, ¿cuál es la diferencia entre:

*EDGE next 
EDGE *next 

y última: si estoy añadiendo:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

es es lo mismo que:

pEDGE  head; 
+5

En general, se considera un mal estilo para ocultar un '*' detrás de un typedef. Solo puede conducir a la confusión. Los programadores leen * cosa más rápido que pThing. Lo mismo ocurre con otros elementos de sintaxis, como '#define AND &&', etcétera. En resumen: no lo hagas. – wildplasser

Respuesta

10

No puede usar pEDGE dentro de la definición ion de la estructura. Usted también debería hacerla algo como:

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

También hay que señalar que edge_item es un puntero doble. También mencionas eso en tu pregunta. Por lo tanto, si utiliza pEDGE_ITEM y solo desea tener un puntero normal, no debe escribir pEDGE_ITEM *edge_item, sino solo pEDGE_ITEM edge_item.

Para aclarar, todas las siguientes declaraciones son equivalentes:

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

Pero

pEDGE_ITEM *edge_item; 

es equivalente a

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

Sobre *EDGE next que es la sintaxis incorrecta. La sintaxis correcta sería EDGE* next o pEDGE next. Entonces, una vez que se define struct edge, puede usar cualquiera de estos dos, pero al definir la estructura, debe hacer lo que muestro al principio de mi respuesta.

Sí, las dos definiciones siguientes son equivalentes:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

Vi que en ambas respuestas escribiste para usar "struct edge", ¿cómo es que esto es correcto mientras pEdge no lo es? esto tampoco está definido? – user1386966

+0

porque no puede usar typedefs 'EDGE' ni' pEDGE' hasta que la estructura esté completamente definida. Una vez que lo esté, puede usar libremente los typedefs en lugar de usar el más largo 'struct edge' o' struct edge * '. – betabandido

+0

muchas gracias! – user1386966

2

Está utilizando un alias de tipo antes de que se define. El uso de la variable de estructura es una solución:

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

Tenga en cuenta que es casi seguro que utilizó los alias puntero incorrectamente, que los evitaba.

0

Creo que esto debería funcionar bien.

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;