6

我是 C 语言的新手,对所有指针的东西都有一些问题。

我写了这段代码:

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;

我以这种方式得到一个错误,只是无法理解为什么。

我知道edgeitem并且edge是标签,我可以使用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;
4

3 回答 3

10

您不能在结构的定义中使用 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* nextor pEDGE next。因此,一旦struct edge定义了您就可以使用这两个中的任何一个,但是在定义结构时,您必须按照我在答案开头显示的那样做。

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

typedef struct edge_list {
    EDGE        *head;
} EDGE_LIST;

typedef struct edge_list {
    pEDGE        head;
} EDGE_LIST;
于 2012-05-26T19:10:55.950 回答
2

您在定义之前使用类型别名。使用结构标签是一种解决方法:

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

请注意,您几乎可以肯定错误地使用了指针别名,我避免使用它们。

于 2012-05-26T19:12:01.213 回答
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;
于 2014-01-20T20:45:44.547 回答