2012-05-26 41 views
6

Tôi khá mới trong C và có một số vấn đề với tất cả các công cụ con trỏ.typedef struct pointer definition

tôi đã viết mã này:

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; 

tôi nhận được một lỗi theo cách này và chỉ không thể hiểu tại sao.

Tôi biết rằng edgeitemedge là các thẻ và tôi có thể sử dụng struct edge *next nhưng tôi đã khai báo các con trỏ sao cho tôi không thể sử dụng chúng?

Tôi có cần sử dụng * nếu tôi có con trỏ không?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

Tôi không thể hiểu, đó là con trỏ tại sao tôi thêm *?

Và câu hỏi cuối cùng là:

*EDGE next 
EDGE *next 

và mới nhất:: Nếu tôi đang sử dụng ở trên, sự khác biệt giữa những gì nếu tôi nói thêm:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

là nó giống như:

pEDGE  head; 
+5

Thông thường, nên bỏ dấu '*' phía sau typedef. Nó chỉ có thể dẫn đến sự nhầm lẫn. Các lập trình viên đọc * nhanh hơn pThing. Cũng vậy với các phần tử cú pháp khác, chẳng hạn như '#define AND &&', v.v. Trong ngắn hạn: không làm điều đó. – wildplasser

Trả lời

10

Bạn không thể sử dụng lệnh PEDGE trong definit ion của cấu trúc. Bạn sẽ làm điều gì đó như:

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

Bạn cũng phải lưu ý rằng edge_item là con trỏ kép. Bạn cũng đề cập đến điều đó trong câu hỏi của bạn. Vì vậy, nếu bạn sử dụng pEDGE_ITEM và bạn chỉ muốn có một con trỏ bình thường, bạn không nên viết pEDGE_ITEM *edge_item nhưng chỉ cần pEDGE_ITEM edge_item.

Đối với việc làm rõ, tất cả các tờ khai sau là tương đương:

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

Nhưng

pEDGE_ITEM *edge_item; 

tương đương với

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

Về *EDGE next đó là cú pháp sai. Cú pháp chính xác sẽ là EDGE* next hoặc pEDGE next. Vì vậy, một khi struct edge được định nghĩa bạn chỉ có thể sử dụng bất kỳ trong hai, nhưng trong khi xác định cấu trúc, bạn phải làm như tôi hiển thị ở đầu câu trả lời của tôi.

Vâng, hai định nghĩa sau đây là tương đương:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

Tôi thấy rằng trong cả hai câu trả lời bạn đã viết để sử dụng "cấu trúc cạnh", làm thế nào đến đó điều này là chính xác trong khi pEdge không? điều này cũng không xác định? – user1386966

+0

vì bạn không thể sử dụng cả kiểu chữ “EDGE' lẫn' pEDGE' cho đến khi cấu trúc được xác định đầy đủ. Một khi nó được, bạn có thể tự do sử dụng typedefs thay vì sử dụng 'struct cạnh' dài hơn hoặc' struct cạnh * '. – betabandido

+0

cảm ơn bạn rất nhiều !!! – user1386966

2

Bạn đang sử dụng một loại bí danh trước khi nó được định nghĩa. Sử dụng thẻ cấu trúc là giải pháp thay thế:

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

Lưu ý rằng bạn gần như chắc chắn đã sử dụng bí danh con trỏ không chính xác, tôi tránh chúng.

0

Tôi nghĩ điều này sẽ hoạt động tốt.

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;