如何在结构体定义中使用指针指向下一个结构体:
typedef struct A {
int a;
int b;
A* next;
} A;
这是我最初写的方式,但它不起作用。
你可以在一条语句中定义typedef并前置声明结构体,然后在后续的定义中定义结构体。
typedef struct A A;
struct A
{
int a;
int b;
A* next;
};
编辑:正如其他人所提到的,如果没有前向声明,在结构定义内部结构名称仍然是有效的(即可以使用struct A
),但是在typedef定义完成之前,typedef不可用(因此仅使用A
无效)。如果只有一个指针成员,这可能并不太重要,但如果您有具有许多自我类型指针的复杂数据结构,则可能不太方便。
除了第一个答案之外,不使用typedef和前向声明,这种写法也可以。
struct A
{
int a;
int b;
struct A *next;
};
在A*
之前缺少struct
。
typedef struct A {
int a;
int b;
struct A* next;
} A;
您可以不使用前向声明:
struct A {
int a;
int b;
struct A *next;
};
请注意,您正在使用C语言,而不是C++。
如果您真的必须要typedef一个结构体(而我与大多数程序员一起工作的人不会这样做¹),请按照以下方式进行:
typedef struct _A {
int a;
int b;
struct _A *next;
} A;
_A
(在结构体命名空间中)和A
(在类型命名空间中),需要进行明确的区分。typedef
会隐藏指针所指向的类型的大小和存储方式,但一些人认为在像C这样的低级语言中,试图隐藏任何东西都是有害且适得其反的。因此,建议在需要使用struct A
时,请坚持输入完整的命名空间前缀。
a = b
都是低效或不起作用的。 - ephemienttypedef struct {
values
} NAME;
这是一种更短的方式来定义结构体,我认为这是最简单的符号表示法,只需将名称放在前面而不是后面。
然后你可以像这样调用它
NAME n;
NAME *n; // if you'd like a ptr to it.
这种方法有什么问题吗?