陈浩师兄03年的一篇博客《用C写有面向对象特色的程序》描述了用C语言来实现相似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换,仍是用陈浩师兄原博的结构体来举例吧。两个结构体以下:安全

/*双向链表 (相似于父类)*/typedefstructhLinks{struct hLinks *bwLink;struct hLinks *fwLink;

} hLinks;

/** 一个使用双向链表的结构

* (相似于子类)*/typedefstructhEnt{

hLinks links;inthData;char key[10];

} hEnt;

首先,咱们要搞清楚的一点是:C语言中的结构体并不能直接进行强制类型转换,只有结构体的指针能够进行强制类型转换。所以你能够在原博中看到在函数调用的时候有一些比较别扭的参数形式,咱们来看看。函数

/** 打印 (相似于子类重载父类的成员函数)*/PrintLink( hLinks*h )

{

hEnt*p ;for( p = ( hEnt* ) h->fwLink; /*

p= ( hEnt* )( (hLinks*)p )->fwLink )

{

printf("hData=[%d], key=[%s]/n", p->hData, p->key);

}

}

PrintLink函数的参数是一个hLinks类型的指针,所以在调用PrintLink时传入参数也应该是hLinks类型的指针,若是咱们定义的时候用下面这样的形式。spa

hLinks head;

那么在调用函数的时候就必须把它转换成hLinks指针,因而先取地址在强制类型转换。.net

PrintLink( (hLinks *) &head );

这样看起来确实是很别扭,若是咱们在声明结构体的时候这样作的话就能够避免这么难看的传递形式。指针

typedef hLinks *PtrhLinks;

话说回来,结构体指针的强制类型转换问题在这里面始终存在。PrintLink中就出现了这样的状况,那么在将hLinks指针转换为hEnt类型指针时有两个问题:code

结构体中的成员状况是怎么的?

结构体中的成员的值的状况是怎么样的?

首先,结构体是储存在一块连续内存中的,计算机只关心的是结构体的大小和操做方式,结构体大小是定义的时候决定的(要进行对齐),而结构体的操做确实和结构体中的成员类型有关的。指针表示的是内存地址,那么在强制类型转换以后,计算机便以转换后的结构体来看待这个地址内存中的内容。好比两个结构体的内存结构以下:对象

hLinks                         hEntblog

*bwLink

*bwLink

*fwLink

*fwLink

——(未定义)

hData

——(未定义)

key[10]

能够看出,在前两个内存单元中两个结构体存储的内容是相同的,固然无论相不相同计算机是无论的,当hLinks类型转换成hEnt类型时,计算机就将原结构体看作是hEnt类型的。转换后的hEnt类型结构体的前面两个内存单元的内容就是hLinks中的前两个单元内容,而hEnt的后两个内存单元中的内容取得是hLinks后的两个单元(这两个单元不是hLinks类型的成员,而是别的内容,全部若是转换后的hEnt要访问hData和key的话是不安全的!)。继承

总之一句话,在转换以后,计算机就按照转换后的结构体的组成结构来解释那么一段内存中存储的数据!!内存

c语言强制转换为结构体,C语言结构体的强制类型转换相关推荐

  1. c语言float转换为int_关于C语言的类型

    在一切的开始,内存只是一片荒芜,后修真者编译天地,便有了今天的锦绣山河. 一块没有使用的内存就像是一片荒凉的大地,为了更方便管理,人们进行区域划分,便有了良田千顷,房屋万座,为了更方便的管理内存,几乎 ...

  2. c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  3. C语言基础1:初识C语言(转义、注释;数组、操作符、反码、补码、static、define、指针、结构体常变量;局部变量;作用域、生命周期)

    文章目录 C语言基础1:初识C语言 1.C语言简介 1.1什么是C语言 1.2C语言的发展 2.第一个C语言程序 2.1创建项目 2.2添加源文件 2.3写代码 3.数据类型 4.变量.常量 4.1定 ...

  4. 【C语言】深度探索offsetof,解析结构体的成员数组和指针

    目录 一.offsetof的功能 二.自定义offsetof 三.探索结构体 3.1结构体中的成员 3.2结构体指针和数组 该篇博客主要讲了自定义offsetof是如何实现的,为什么要这样写,以此沿生 ...

  5. 一文攻破结构体-C语言

    一文攻破结构体-C语言 1 什么是结构体 1.1 结构体类型 结构体(structure)是由不同类型数据组成的组合型的数据结构,可以看做变量的集合.结构体也是一个数据类型,就像和 int.char一 ...

  6. c语言中有关void,sizeof,结构体的一些问题

    void[1]: void是C语言中的空类型,void的用途有二. 1.对函数返回的限定: 如果函数没有返回值,则默认返回整数类型,而不是void类型.c++有很严格的类型,不允许函数不加类型声明,而 ...

  7. C语言坐标结构,关于c语言结构体偏移的一点思考(一)

    1 引言 而在实际开发过程中,比较常见的场景是给定结构体变量的初始地址,如何访问结构体内每一个成员变量?这类问题的核心是如何快速的计算结构体成员变量的偏移地址.本文将和大家一起探讨结构体内成员变量偏移 ...

  8. c语言结构体学习整理(结构体初始化,结构体指针)

    渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char -等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用, ...

  9. c语言结构体加联合,C语言:结构体和联合体(共用体)

    结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...

最新文章

  1. maven项目首页显示的问题
  2. 企业价值观念形成的四个阶段
  3. flutter已经支持安卓热更新_flutter 在 android 上的热更新
  4. SpringMVC中过滤器和拦截器的区别
  5. jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
  6. c语言程序设计数据存储方案,c语言程序设计“第02章数据的存储及运算.ppt
  7. bert预训练模型解读_超越谷歌BERT!依图预训练语言理解模型入选NeurIPS
  8. 获取当前scn号scn1_Checkpoint和SCN的解析
  9. Toeplitz matrix 与 Circulant matrix
  10. JavaFX 记录刚刚接触JavaFX遇到的问题
  11. Java Web从前端到后台常用框架介绍
  12. 【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
  13. WordPress 全方位优化指南(上)
  14. 二维傅里叶变换频谱图的含义
  15. matlab中数组的创建
  16. android qq 退出帐号,大家手机上的QQ平常用完退不退出帐号
  17. 计算机软件考试成绩查询时间,2020年计算机软考什么时候出成绩,怎么查成绩?|...
  18. 348高校毕业设计选题
  19. 挚爱家乡五常大米的味道
  20. 【科创人】快狗打车CTO沈剑:努力不会背叛,承担社会责任的企业胜算高一点点...

热门文章

  1. 服装标签二维码,要如何制作?含品牌案例
  2. 线性回归系数的标准误_回归模型中的标准化回归系数是什么,该如何计算得到?...
  3. 狂暴者 pat basic 练习二十八 人口普查 测试点3格式错误
  4. bzoj1503: [NOI2004]郁闷的出纳员
  5. 赵氏孤儿案--找到编程的兴趣点
  6. 什么游戏耳机性价比高?值得入手的蓝牙游戏耳机
  7. keepalived配置VIP(虚拟IP)
  8. java stringutils isnumeric_肯爹的 StringUtils.isNumeric(String str)
  9. 第二天u3d的学习!
  10. js实现键盘操作对div的移动或改变-------Day43