2012-05-26 87 views
6

我在C中很新,并且遇到了所有指针的问题。typedef结构体指针定义

我写了这个代码:

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; 

我得到一个错误这样的,只是不能明白为什么。

我知道edgeitemedge是标签,我可以使用struct edge *next但我宣布指针,所以我怎么不能使用它们?

如果我有指针,我需要使用*吗?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

我不明白,这是一个指针,所以我为什么要添加*?

最后一个问题是: 如果我使用上面,有什么区别:

*EDGE next 
EDGE *next 

和最后一个: 如果我加入:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

是它相同:

pEDGE  head; 
+5

在typedef后面隐藏一个'*'通常是一种糟糕的风格。这只会导致混乱。程序员阅读*比pThing更快。其他语法元素也是如此,例如'#define AND &&'等等。总之:不要这样做。 – wildplasser

回答

10

你不能在definit中使用pEDGE结构的离子。你应该这样做:

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

你还必须注意,edge_item是一个双指针。你也提到你的问题。所以如果你使用pEDGE_ITEM而你只想有一个正常的指针,你不应该写pEDGE_ITEM *edge_item,而只是pEDGE_ITEM edge_item

对于澄清,所有下面的声明是等价的:

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

pEDGE_ITEM *edge_item; 

相当于

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

关于*EDGE next这是错误的语法。正确的语法是EDGE* nextpEDGE next。因此,一旦定义了struct edge,您就可以使用这两者中的任何一个,但在定义结构时,必须按照我在答案开始处显示的那样进行操作。

是,下面的两个定义是等价的:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

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

我看到在你写的使用“struct edge”的两个答案中,pEdge不是这样是正确的吗?这也是未定义的? – user1386966

+0

,因为在结构完全定义之前,您不能使用'EDGE'和'pEDGE' typedefs。一旦完成,您可以自由使用typedefs而不是使用较长的'struct edge'或'struct edge *'。 – betabandido

+0

非常感谢你! – user1386966

2

您正在使用的定义之前,它是类型别名。使用结构变量是一种变通方法:

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

注意,你几乎肯定使用了指针别名不正确,我避开他们。

0

我认为这应该可以正常工作。

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;