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

本文探讨了C语言中结构体的特殊声明方式,即不完全声明,以及结构体内部能否自引用的问题。指出结构体的自引用需要通过指针实现,并提供了一个正确的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体的特殊声明

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

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;

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

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

 

这样就可以编译成功了。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值