本章目录:

  • 1. c语言中%x、%c、%d、%x等等等
  • 2. c语言取地址符&的作用
  • 3. 了解 C语言中的 联合体
    • 3.1 什么是联合体?
    • 3.2 定义
      • 3.2.1 举例
    • 3.3 初始化联合体
    • 3.4 应用
  • 参考文献

1. c语言中%x、%c、%d、%x等等等

%a,%A                    读入一个浮点值  
%c                      读入一个字符   
%d                      读入十进制整数   
%i                      读入十进制,八进制,十六进制整数   
%o                      读入八进制整数   
%x,%X                   读入十六进制整数   
%s                      读入一个字符串,遇空格、制表符或换行符结束。   
%f,%F,%e,%E,%g,%G       用来输入实数,可以用小数形式或指数形式输入。   
%p                      读入一个指针   
%u                      读入一个无符号十进制整数   
%n                      至此已读入值的等价字符数   
%[]                     扫描字符集合   
%%                      读%符号

2. c语言取地址符&的作用

C语言取地址符&的有两个常用的地方。

  1. 指针变量赋值
int m = 214;int *i = &m;
  1. 在函数的形式参数中出现在形参变量的前面
void func(int* &i){}

3. 了解 C语言中的 联合体

3.1 什么是联合体?

在C语言中,变量的定义是分配存储空间的过程。一般的,每个变量都具有其独有的存储空间,那么可不可以在同一个内存空间中存储不同的数据类型(不是同时存储)呢?

答案是可以的,使用联合体就可以达到这样的目的。联合体也叫共用体,在C语言中定义联合体的关键字是union。

3.2 定义

定义一个联合类型的一般形式为:

union 联合名
{成员表
};

成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节数。

3.2.1 举例

方法一:先创建模板,再定义变量

// 创建联合体模板union perdata
union perdata
{int Class;char Office;
};
// 使用该联合体模板创建两个变量a, b
union perdata a,b;

此处,perdata是联合体名,该名字是由我们任意定的,但是尽量起个有意义的名称。其相当于一个模板,可以使用这个模板去定义变量a、b。定义的时候不要忘了union。

方法二:同时创建模板和变量

// 创建联合体模板union perdata的同时定义两个变量a、b
union perdata
{int Class;char Office;
}a,b;

这与方法一差不多。

方法三:省略联合体名

union
{int Class;char Office;
}a,b;

相对于方法一与方法二,此处省略了联合体名。虽然更简洁了,但是因为没有了名字,后面就不能用该联合体定义新的变量。

方法四:使用typedef

// 联合体模板union perdata重新命名为perdata_U
typedef union perdata
{int Class;char Office;
}perdata_U;
// 使用新名字perdata_U创建两个变量a, b
perdata_U a,b;

3.3 初始化联合体

联合体的初始化与结构体不同,联合体只能存储一个值。联合体有三种初始化方法:

perdata_U a;
a.Class = 10;
perdata_U b = a;               /* 1、把一个联合初始化为另一个同类型的联合; */
perdata_U c = {20};                /* 2、初始化联合的第一个成员; */
perdata_U d = {.Office = 30};   /* 3、根据C99标准,使用指定初始化器。 */

3.4 应用

应用一: 判断是大端还是小端
关于大端小端的理解,请移步至这篇文章,传送门

#include<stdio.h>
#include <stdbool.h>
union Utest
{short num;char c;
};
int main(void)
{union Utest u;u.num = 0x5566;printf("%x\n",u.c);//66,66是低位,读取内存时,是从低地址到高地址,低地址中存储的是低位,因此是小端return 0;
}

应用二:分离高低字节
单片机中经常会遇见分离高低字节的操作,比如进行计时中断复位操作时往往会进行

(65535-200)/256,(65535-200)%256

这样的操作,而一个除法消耗四个机器周期,取余也需要进行一系列复杂的运算,如果在短时间内需要进行很多次这样的运算无疑会给程序带来巨大的负担。其实进行这些操作的时候我们需要的仅仅是高低字节的数据分离而已,这样利用联合体我们很容易降低这部分开销。

代码:

union div
{int n;     // n中存放要进行分离高低字节的数据char a[2]; // 在keil c中一个整形占两个字节,char占一个字节,所以n与数组a占的字节数相同
}test;
test.n = 65535-200; // 进行完这句后就一切ok了,下面通过访问test中数组a的数据来取出高低字节的数据
TH1 = test.a[0];    // test.a[0]中存储的是高位数据
TL1 = test.a[1];    // test.a[1]中储存了test.n的低位数据

联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端,如果其他编译器还请自测。仅仅用了一条减法指令就达到了除法、取余的操作,在进行高频率定时时尤为有用。

=========================================================================

参考文献

c语言

联合体

大小端判断

【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体相关推荐

  1. C语言加取址符的作用,C语言中指针和取地址符的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  2. c语言函数变量地址符,C语言中取地址符做函数形参?—— 引用的讨论

    取地址符&做函数形参? C语言强大且危险 引入 这个问题花去了整整一天的研究. 先看一段严蔚敏的<数据结构>中栈的例程: 这里面的&S第一遍看的时候想当然的认为是取了SqS ...

  3. C语言中 指针变量 取地址符的用法 *指针变量名的用法

    文章目录 总结 Intro Code 图示 总结 众所周知,内存可以看成一个一个相邻的格子(类比Excel),而数据就存储于这些格子之中(size大的变量占用格子数多,size小就占用小).而每个格子 ...

  4. 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...

    初学者在学习C语言,谈到不同数据类型时,一般都能理解 unsigned 和 signed 的区别,无非就是有无符号而已.但是对于 signed 数据类型的数据范围,初学者却常常会感到迷惑. 对于 si ...

  5. 函数用法r语言_R语言中的apply函数族

    前言 apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环.分组.过滤.类型控制等操作.但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全 ...

  6. table是什么函数c语言,c语言中table的用法

    c语言中table的用法 c语言中table的用法的用法如下:1 说明1.1 RECORD定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离 ...

  7. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  8. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  9. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

最新文章

  1. Java项目:嘟嘟校园一卡通系统(java+JSP+Servlet+html+css+JavaScript+JQuery+Ajax+mysql)
  2. Cookie,Session
  3. python 状态机教程_python 实用工具状态机transitions
  4. “尽快成立国家级权威信息安全部门”
  5. centos 7 局域网丢包排查_宽带发生故障怎么办?教你几招轻松排查
  6. ubuntu 15.04 系统中如何启用、禁用客人会话
  7. 搜索 —— 启发式搜索 —— 模拟退火
  8. 为转型绞尽脑汁,新东方到美国教中文!网友:卷到国外去了
  9. 熬了整整30天,字节跳动算法工程师面试
  10. 数字通信(知识点)复习
  11. 期末速通主成分分析(PCA)
  12. 伺服驱动系统的电磁干扰问题
  13. 【量化笔记】股票收益率与风险计算
  14. 平行四边形周长和面积计算c语言,平行四边形的周长公式
  15. mysql rrd_时间序列数据库rrd启动
  16. vue框架优点和缺点
  17. LTE CA下的频点计算
  18. 一起来聊一聊MySQL:从B树到B+树到索引再到存储引擎
  19. OpenMV物品清单
  20. 大学计算机基础 一 实验报告,《大学计算机基础》实验报告实验一.docx

热门文章

  1. 从tf1到tf2的几个函数转换
  2. Apple Watch Series 6和Apple Watch SE的区别
  3. 基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码
  4. mysql join sum_mysql-涉及SUM,LEFT JOIN和GROUP BY的复制
  5. cursor css(鼠标悬浮禁用) 网页制作CSS中的光标类型
  6. [2017.11.05]正则表达式集合list
  7. 0基础制作微信小程序(案例:超市)
  8. 仿淘宝网商品SKU系统设计经验分享
  9. CentOS8网络配置方式
  10. PHP 循环取2个时间之内的年月