结构体的特殊声明
结构体我们通常是这么声明的:
struct Student
{
char name[20];
int age;
int num;
};
或者
struct Student
{
char name[20];
int age;
int num;
}s1, s2;
这是我们正常的声明方式, 也是正规的声明方式, 第二种是声明的同时创建了变量s1, s2。但是结构体的声明方式也包括一种特殊的声明方式——不完全声明。
下面是不完全声明:
struct
{
int a;
int b;
int c;
}a, b, c;
这种结构体只能在创建该结构体蓝图时创建变量。之后这个蓝图就再也无法使用。
那么现在看这一串代码:
虽然没有编译错误, 但是图中我们可以看到, vs给我们报了一下警告。 说明a的地址类型与pa的指针类型是不一样的。由此我们可以发现, 对于一个不完全定义的结构体。即便结构体的内部成员全部相同, 两个结构体也是不相同的。
结构体的自引用
结构体的成员也可以是结构体, 比如:
如图就是一个结构体的成员变量也是结构体类型。
但是, 现在有一个问题, 结构体的内部成员可以是自己吗?
我们来看一下vs是怎么说的。
我们可以这样理解:在一个结构体内部包含自己, 但是此时这个结构体还没有创建出来, 也就是说结构体还未进行定义。所以是不行的。
那么结构体怎么自引用呢?
可以利用指针,如图:
现在看这样一串代码:
typedef struct student
{
char name[20];
int age;
int num;
Stu* nextstu;
}Stu;
请观察这一串代码是否正确呢?
语法错误, 这样是不行的。可以和上面的理解方式一样:直接使用重新定义后的结构体名进行本结构体内部成员的定义,但是使用的时候,这个结构体还没有被重新进行命名。所以出错了。正确的方式应该是这样的:
这样就可以编译成功了。