结构体的特殊声明和自引用

结构体的特殊声明

结构体我们通常是这么声明的:

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;

这种结构体只能在创建该结构体蓝图时创建变量。之后这个蓝图就再也无法使用。

那么现在看这一串代码:

结构体的特殊声明和自引用_第1张图片

 虽然没有编译错误, 但是图中我们可以看到, vs给我们报了一下警告。 说明a的地址类型与pa的指针类型是不一样的。由此我们可以发现, 对于一个不完全定义的结构体。即便结构体的内部成员全部相同, 两个结构体也是不相同的。 

结构体的自引用

结构体的成员也可以是结构体, 比如:

结构体的特殊声明和自引用_第2张图片 

如图就是一个结构体的成员变量也是结构体类型。

但是, 现在有一个问题, 结构体的内部成员可以是自己吗?

我们来看一下vs是怎么说的。

结构体的特殊声明和自引用_第3张图片 

 我们可以这样理解:在一个结构体内部包含自己, 但是此时这个结构体还没有创建出来, 也就是说结构体还未进行定义。所以是不行的。

那么结构体怎么自引用呢?

可以利用指针,如图:

结构体的特殊声明和自引用_第4张图片

 现在看这样一串代码:

typedef struct student

{

        char name[20];

        int age;

        int num;

        Stu* nextstu;    

}Stu;

请观察这一串代码是否正确呢?

结构体的特殊声明和自引用_第5张图片

语法错误, 这样是不行的。可以和上面的理解方式一样:直接使用重新定义后的结构体名进行本结构体内部成员的定义,但是使用的时候,这个结构体还没有被重新进行命名。所以出错了。正确的方式应该是这样的:

 结构体的特殊声明和自引用_第6张图片

这样就可以编译成功了。 

你可能感兴趣的:(C语言专栏,c语言)