我在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;
答案 0 :(得分: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* next
或pEDGE next
。因此,一旦定义了struct edge
,您就可以使用这两者中的任何一个,但在定义结构时,您必须按照我在答案开头所示的那样进行。
是的,以下两个定义是等效的:
typedef struct edge_list {
EDGE *head;
} EDGE_LIST;
typedef struct edge_list {
pEDGE head;
} EDGE_LIST;
答案 1 :(得分:2)
在定义之前使用类型别名。使用结构标记是一种解决方法:
typedef struct edge
{
EDGE_ITEM *edge_item;
struct edge *next; //pointer to next edge
struct edge *prev; //pointer to prev edge
} EDGE;
请注意,您几乎肯定错误地使用了指针别名,我避免使用它们。
答案 2 :(得分: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;