结构体自引用

结构体基础-结构体自引用

1.结构体的自引用

结构体内部的成员是否可以是该结构体本身。即结构体是否可以包含结构体本身?

答案:不可以

举例:

struct self_contain
{
	char author[50];
	float price;
struct self_contain  mu;
};

这种类型的自引用是非法的,因为成员mu是另一个结构体,类型是struct self_contain它的内部还要包含自己的成员mu。
这个mu还将包括自己的成员mu,这样重复下去,永无止境。
像是一个永远不会终止的递归程序。

2. 结构体可以怎样被自引用

使用结构体指针

举例:

struct self_contain
{
	char author[50];
	float price;
	struct self_contain*  mu;
};

mu现在是一个结构体指针,指针的长度是确定的。
编译器在结构体的长度确定之前就已经知道了指针的长度,所以使用结构体指针的自引用是合法的。

结构体内部包含一个指向该结构体本身的指针,事实上,该指针所指向的是同一种类型的不同的结构体,链表和树就是使用这种技巧实现的。

3.结构体指针自引用的错误示例

这个错误示例与结构体初始化的方式有关,如果声明时省略结构体名(结构标签),使用结构体指针自引用也是不合法的!

举例:

typedef struct 
{
	char author[50];
	float price;
	SELF_CONTAIN*  mu;
}SELF_CONTAIN;

使用typedef创建SELF_CONTAIN并且其结构成员可以自引用,但是上述示例在定义mu时,SELF_CONTAIN并没有创建,所以在结构体内部定义mu时,结构体类型并没有创建,所有不合法。

合法的方式:

typedef struct self_contain_tag
{
	char author[50];
	float price;
	self_contain_tag*  mu;
}SELF_CONTAIN;
  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
回答: 在C语言中,结构体可以被自引用。这意味着结构体可以包含对自身类型的成员引用。然而,这种自引用必须是通过使用指针来实现的,而不是直接嵌套结构体。这是因为直接嵌套结构体会导致无限递归,从而引发编译错误。通过使用指针,可以在结构体中存储对同一类型的结构体引用。这种技术在处理树形结构或链表等数据结构时特别有用。例如,可以定义一个包含指向自身类型的指针的结构体成员,以实现结构体的自引用。这样做可以创建具有循环引用结构体。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++结构体变量的引用 | 结构体变量引用](https://blog.csdn.net/weixin_48669767/article/details/111936811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [结构体引用](https://blog.csdn.net/xiawucha159/article/details/127184246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiawucha159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值