当前位置: 首页 > ds >正文

自学嵌入式 day 17- c语言-第11章 结构体与共用体 第12章 位运算

第十一章 结构体与共用体

11.1 结构体

声明:

struct Student  //结构名,符合标识符规则,第一个字母大写

{

        int id;

        char name;

        float score;

};

定义:

struct Student(结构名)  s(变量名);

s.id = 1;//“  . ”结构体运算符,优先级为1,表达式为int 型

strcpy(s.name,"zhangsan");

s.score = 77;

作用:将不相关的内容打包,封装在一起,可统一引用。

(1)声明可放在头文件中,可在声明后定义变量,具有全局作用域,是全局变量。

(2)初始化:

struct Student s = {1,"zhangsan",77};

次序于声明顺序一致,且可选择元素初始化 s = {.id = 1,.score = 77};结构体成员部分初始化。

(3)结构体变量与变量之间可整体赋值。

考点:下列结果为:

printf("%d\n",sizeof(struct Student));

        内存对齐:cpu与RAM之间由地址总线,数据总线、控制总线连接,其中数据总线有32根,一次性传递32个比特,也就是4个字节,cpu访问时以4个字节为单位,所以系统存储数据时会将变量的地址放在可被四整除的位置上,方便cpu访问,这个过程为内存对齐。

        解法:

(1)默认按照计算机位数对齐,若计算机位数为64,则最终大小必须为64 / 8 = 8的整数倍。

(2)从结构体成员中查找字节数最大的成员,最终大小按此成员大小对齐。

(3)把每个成员按照声明顺序依次存入内存,偏移量 / sizeof(成员)必须整除。

注:

(1)-> :指向结构体成员运算符,当成员用指针指向时可用。

(2)结构体不可整体比较,可被整体赋值。

11.2 共用体

声明:

union 共用体名

{

        ...

} ;

(1)成员共享内存空间,从字节的起始部分开始共享。

(2)其值会被最后成员的值覆盖。

用法:判断小端存储

union Demo

{

        int i;

        char j;

};

int main(void)

{

        union Demo s ;

        s.i = 1;

        if(d.c == 1)

        {

                puts("little");

        }

        else

        {

                puts("big");

        }

}

补充:可用指针判断小端存储

int main(void)

{

        int i = 1;

        char *j = (char *) &i;

        if(*j == 1)

        {        

        puts("little");        

        }

}

11.3 枚举类型

声明:

enum 枚举类型名

{

        ...

};

定义:

 enum 枚举类型名 变量名;

11.4 用typedef定义类型

typedef 数据类型 数据名

好处:使用类型时可简化复杂的类型名称;

坏处:代码可读性降低;

第十二章 位运算

操作数必须是整形或者与整形相兼容的类型。

12.1 位运算符

(1)按位与-" & ",指定位清零 

        参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

(2)按位或-" | ",指定位置1

        两个相应的二进制位中只要有一个为1,该位的结果值为1。

(3)按位异或-" ^ ",指定位翻转

        若参加运算的两个二进制位同号,则结果为0(假);异号则为1(真)。

(4)按位取反-" ~ "

        是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。

(5)左移-"<<"

        用来将一个数的各二进制位全部左移若干位,右边只补零。

补充:

①指定位清零

②指定位置1

(6)右移-">>"

        无符号数右移补零,逻辑右移,有符号数右移补1,算数右移。

http://www.xdnf.cn/news/5505.html

相关文章:

  • 深入浅出之STL源码分析5_类模版实例化与特化
  • RAG与语义搜索:让大模型成为测试工程师的智能助手
  • DVWA靶场Cryptography模块medium不看原码做法
  • Python时间模块
  • MySQL 从入门到精通(二):DML 数据操作与 DQL 数据查询详解
  • Python项目75:PyInstaller+Tkinter+subprocess打包工具1.0(安排 !!)
  • 阿里云OSS-服务端加签直传说明/示例(SpringBoot)
  • Python数据分析案例75——基于图神经网络的交通路段流量时间序列预测
  • navicat 如何导出数据库表 的这些信息 字段名 类型 描述
  • fota移植包合入后编译验证提示:File verification failed
  • Java线程池深度解析:从使用到原理全面掌握
  • KTOR for windows:無文件落地HTTP服务扫描工具
  • 【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)高级用法(二)
  • 教育行业的 RAG 落地:个性化学习助手设计
  • 【Linux基础】网络相关命令
  • Client 和 Server 的关系理解
  • Yocto项目实战经验总结:从入门到高级的全面概览
  • 大模型Embedding模型介绍与使用
  • [CANN] 安装软件依赖
  • 数仓-可累计,半累加,不可累加指标,是什么,举例说明及解决方案
  • 前端面试题:说说你对 Vue 中异步组件的理解
  • jetson orin nano super AI模型部署之路(十)使用frp配置内网穿透,随时随地ssh到机器
  • 单词怎么记:以use一词为例
  • Java中Comparator排序原理详解
  • 3. 无重复字符的最长子串(滑动窗口)
  • 客户端建立一个连接需要占用客户端的端口吗
  • NHANES稀有指标推荐:HALP score
  • average per-pixel disparity error: EPE及不同距离值下的误差曲线
  • JavaScript基础-全局作用域
  • 《Python星球日记》 第53天:卷积神经网络(CNN)入门