我目前正在学习指针和结构,我无法理解以下内容
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
为什么这段代码不会抛出错误?
当我使用
创建一个原子时atom x;
printf("%d", x.element);
它将打印5。
我不了解不存在的结构的类型定义,这是如何工作的?
答案 0 :(得分:4)
typedef struct at atom;
在此,您声明一个名为struct
的{{1}},并为其at
提供typedef
。所以这是完全有效的C.
atom
在这里,您定义您之前声明的结构struct at {
int element = 5;
struct at *next;
}
。
注意:强>
重要的是要注意,在C中,不允许像在此处一样初始化结构中的变量:
at
然而,这在C ++中是完全可以的,所以如果您尝试使用C,请删除变量初始化,但如果您正在使用C ++,那么它就像它一样。< / p>
答案 1 :(得分:2)
这是一个前瞻性声明 - 在C中你可以声明一个命名的东西将存在,而不会提供有关它的详细信息,直到以后;最常见的用于允许知识循环;例如struct A
指针指向struct B
,struct B
指针指向struct C
,struct C
指针指向struct A
。在这种特定的情况下,只要你说事情都是结构,那么编译器就知道了类型,知道适当的指针是什么样的。
在这种情况下,您已声明会有一个名为at
的结构,并且您希望将其称为atom
。如果您在告诉编译器atom
看起来是什么之前尝试声明struct at
,那就错了。但在此之前,编译器有足够的信息可以继续。
答案 2 :(得分:1)
你忘了放一个分号
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
^^^^
考虑到它是一个C ++代码。在C中,您可能无法在其定义中初始化结构的数据成员。
此声明
typedef struct at atom;
宣布两件事。首先,它在当前声明性区域中声明新类型struct at
。它声明了此类型atom
每个声明都不一定是同一个定义。
首先声明struct at
,然后定义
struct at {
int element = 5;
struct at *next;
};
比较thsi方法,例如函数。函数也可以多次声明,并且只定义一次。例如
void f();
void f();
//...
void f();
void f() { std::cout << "It is a joke" << std::endl; }
结构可以多次声明,但只定义一次。