2012-05-26 29 views
6

C dilinde oldukça yeni ve tüm işaretçilerle ilgili bazı sorunlar yaşıyorum. Bir hatayı bu şekilde olsun ve sadece cant anlamaktypedef struct pointer tanımı

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; 

:

Bu kodu yazdım.

edgeitem ve edge'un etiketler olduğunu ve struct edge *next kullanabileceğimi biliyorum, ancak işaretçileri nasıl beyan ettim, böylece nasıl kullanamayacağım?

İşaretçim varsa * kullanmam gerekir mi?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

Anlayamıyorum, bu bir işaretçidir, bu yüzden neden ekleyebilirim?

Ve son soru:

*EDGE next 
EDGE *next 

ve sonuncusu: Yukarıda kullanıyorum varsa arasındaki fark ne ben ekliyorum eğer:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

olduğunu olarak aynı:

pEDGE  head; 
+5

Genellikle typedef'in arkasındaki '*' harfini gizlemek yanlıştır. Sadece karışıklığa yol açabilir. Programcılar * şeyi daha hızlı okuyorlar. Aynı şey, #define AND &&, et cetera gibi diğer sözdizimi öğeleri için de geçerlidir. Kısacası: bunu yapma. – wildplasser

cevap

10

Buradaki pEDGE'yi kullanamazsınız yapının iyonu.

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

Ayrıca edge_item çift işaretçi olduğuna dikkat edilmelidir: Sen böyle bir şey yapmak sallanmalıdır. Ayrıca sorunuzda da var. Yani pEDGE_ITEM kullanırsanız ve sadece normal bir işaretçiniz varsa, pEDGE_ITEM *edge_item yazmamalısınız, ancak sadece pEDGE_ITEM edge_item. netleştirilmesi için

, aşağıdaki tüm bildirimleri eşdeğerdir:

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

Ama

pEDGE_ITEM *edge_item; 

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

eşdeğerdir Hakkında *EDGE next yanlış sözdizimi olduğunu. Doğru sözdizimi EDGE* next veya pEDGE next olur. Yani, bir kez struct edge tanımlandığında, bu ikisinden birini kullanabilirsiniz, ancak yapıyı tanımlarken, cevabımın başında gösterdiğim gibi yapmalısınız.

Evet, aşağıdaki iki tanım eşdeğerdir: tanımlanmadan önce bir tip takma adını kullanıyorsanız

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

Her iki cevapta da "struct edge" i kullanmak için yazdığınızı gördüm, pEdge bu kadar doğru değil mi? Bu da tanımlanmamış mı? – user1386966

+0

, çünkü yapının tam olarak tanımlanana kadar ne EDGE' ne de pEDGE yazarak kullanamazsınız. Bir kez, daha uzun 'struct edge' veya' struct edge * 'kullanarak yazım kurallarını serbestçe kullanabilirsiniz. – betabandido

+0

çok teşekkür ederim !!! – user1386966

2

. yapı etiketi kullanarak geçici çözüm: neredeyse kesinlikle yanlış işaretçi takma ad kullanılan

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

Not, onları kaçınılmalıdır.

0

Bunun iyi çalışması gerektiğini düşünüyorum.

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;