C|不完全类型与结构体的自指向指针

不完全类型指“函数之外、类型的大小不能被确定的类型”。

总结一下,C 的类型分为:

① 对象类型(char、int、数组指针结构体等)

② 函数类型

③ 不完全类型:结构体标记声明、void*。

以上的三种类型都可以派生为指针类型。

对于男性(Man),他可能有妻子(wife)。如果是未婚男性,wife 就是NULL。所以,Man 这样的类型,可以声明成下面这样:

struct Man_tag { struct Woman_tag *wife; /*妻*/};

作为妻子,可以这样声明:

struct Woman_tag { struct Man_tag *husband; /*夫*/};

这种情况下,struct Man_tag 和 struct Woman_tag 是相互引用的,所以无论先声明哪一边都很麻烦。

可以像下面这样通过先声明结构体标记来回避以上问题:

struct Woman_tag; // 将 tag 提前声明struct Man_tag { struct Woman_tag *wife; /* 妻 */};struct Woman_tag { struct Man_tag *husband; /* 夫 */};

在某些环境中,结构体必须使用 typedef,所以,

typedef struct Woman_tag Woman; // 提前对 tag 进行类型定义typedef struct { Woman *wife; /* 妻 */} Man;struct Woman_tag { Man *husband; /* 夫 */};

对这种情况,在 Woman 类型的标记被声明的时候,还不知道其内容,所以无法确定它的大小。这样的类型就称为不完全类型。

因为不能确定大小,所以不能将不完全类型变成数组,也不能将其作为结构体的成员,或者声明为变量。但如果仅仅是用于取得指针,是可以使用不完全类型的。

对于指针声明来说,只要其声明的类型存在(基本类型,或已定义或声明的复合类型),便可以从其派生出指针类型。

上面的结构体 Man,就是将 Woman 类型的指针作为它的成员。之后,在定义 struct Woman_tag 的内容的时候,Woman 就不是不完全类型了。

在 C 标准中,void 类型也被归类为不完全类型。

void*类型表示为类型待定的指针,可以被赋值一个任何类型的地址,只要在指针本身操作或操作指针的指向目标时,类型显式强制转换为原始或期望的类型即可。 指针可以指向为不完全类型,同时,指针不论其目标类型如何,其大小都是固定的一个字长,所以在结构体定义中,可以定义一个自指向的指针,这样的指针并不影响结构体的整体内存分配或布局,所以被定义为链式存储(用来关联数据关系)的语法机制:

struct Node{ int data; struct Node* next; // 指针本身的大小确定(一个字长),与目标类型无关};

ref

前橋和弥《征服C指针》

-End-

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月27日
下一篇 2022年7月27日

相关推荐

  • 明星艺人扎堆儿“考编”,宇宙的尽头真是体制?普通人照样有机会

    目前大部分大学生毕业后,都会根据自己的意愿进行工作的选择,或者学历的深造,有些同学迫于社会压力和家庭环境,会尽快选择就业,而随着工作经历增多时,往届生都会在互相闲谈时表示,原来体制…

    2022年7月10日
  • JDK8中的HashMap的put key时的源码学习

    一、putVal()源码 /** * Associates the specified value with the specified key in this map. * If…

    2022年6月28日
  • 分享谷歌网站优化的3种方式(谷歌网站该如何优化)

    谷歌网站优化怎么做?作为网站seo,固定的优化步骤顺序要一定熟知。很多优化人员因思路导致网站迟迟出不了考核期,网站排名忽高忽低,白白浪费了时间。下面我就跟大家好好聊聊如何做goog…

    2022年11月8日
  • 王者荣耀:ag超玩会进不了胜者组,季后赛败者组首轮就出局?

    KPL秋季比赛开始前,也就是9月前,哪个搭档预测AG不会进入胜者组; 谁预测AG会在季后赛失败者小组的第一场比赛中出局? 王者荣耀ag超玩会没有进入胜者组,开球失败者组在第一轮比赛…

    2022年6月29日
  • 数据库开发工具​Navicat Premium

    Navicat Premium 是一个数据库开发工具,可让您从单个应用程序同时连接到 MySQL、MariaDB、SQL Server、Oracle、PostgreSQL 和 SQ…

    2022年6月20日
  • 被一句话惊艳到了

    每个人都要经历一段默默无闻的时光,才能惊艳所有人。 一块石头是绊脚石,还是垫脚石,全看你把它放在什么位置和如何使用它。 人到了一定岁数,自己就得是那个屋檐,再也无法另找地方躲雨了。…

    2022年5月1日
  • 网络是怎样连接的-用电信号传输TCP/IP 数据

    一、TCP 三次握手 connect是一个抽象概念,不是实际存在的。 三次握手就是connect的过程,目的是为了交换序号初始值。 二、发送数据 发送方的数据如果比较大,就需要进行…

    2022年6月20日
  • 中国机器人夹爪行业市场研究报告

    机器人夹爪市场的企业竞争态势 该报告涉及的主要国际市场参与者有Schunk、Festo、SMC、Robotiq、Zimmer、Destaco、EMI、IAI、Applied Rob…

    2022年6月14日
  • 「2022.6.15」iOS今日限免推荐

    今天给大家带来五款限免应用,除了第三款存在内购,其余均无内购,大家放心下载,快来看看吧~ 一、照片尺寸 【无内购】 介绍:更改照片或照片片段大小的应用程序。您可以设置自己的照片像素…

    2022年6月16日
  • Jmeter 插件测试dubbo接口

    对于如何使用Jmeter测试http接口,大家都已经比较熟悉,网上相关的知识也很多。但随着微服务越来越流行,仅仅会测试http接口已经远远不够。Dubbo作为当下非常流行的RPC接…

    2022年7月9日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息