当前位置:网站首页>【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符&的作用、C语言中的 联合体
【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符&的作用、C语言中的 联合体
2022-06-30 11:06:00 【AI很不错呦】
本章目录:
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语言取地址符&的有两个常用的地方。
- 指针变量赋值
int m = 214;
int *i = &m;
- 在函数的形式参数中出现在形参变量的前面
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默认是小端,如果其他编译器还请自测。仅仅用了一条减法指令就达到了除法、取余的操作,在进行高频率定时时尤为有用。
=========================================================================
参考文献
边栏推荐
- 数据库 级联操作
- [leetcode 239] sliding window
- Multiparty Cardinality Testing for Threshold Private Set-2021:解读
- 数据库 自动增长
- OceanBase 安装 yum 源配置错误及解决办法
- Jetpack Compose DropdownMenu跟随手指点击位置显示
- 100 important knowledge points that SQL must master: grouping data
- It's time for the kotlin coroutine to schedule thread switching to solve the mystery
- ESP32-C3入门教程 IoT篇⑤——阿里云 物联网平台 EspAliYun RGB LED 实战之批量生产的解决方案
- EMC-浪涌
猜你喜欢

Oceanbase installation Yum source configuration error and Solutions

A theoretical defect of relative position coding transformer and Its Countermeasures

数学(快速幂)

Mathematics (fast power)

CVPR 2022 | greatly reduce the manual annotation required for zero sample learning. Mapu and Beiyou proposed category semantic embedding rich in visual information

Handler source code analysis

Uncover the whole link communication process of customer service im

微信表情符号被写入判决书,你发的每个 emoji 都可能成为呈堂证供

R language de duplication operation unique duplicate filter

Discussion on the essence of "FPGA mining" from open source projects
随机推荐
It's time for the kotlin coroutine to schedule thread switching to solve the mystery
建立自己的网站(13)
国产数据库的黄金周期要来了吗?
The first China Digital Collection conference will be held soon
Alibaba cloud lifeifei: China's cloud database has taken the lead in many mainstream technological innovations abroad
What is erdma as illustrated by Coptic cartoon?
Train an image classifier demo in pytorch [learning notes]
【leetcode 239】滑动窗口
Mathematics (fast power)
"New digital technology" completed tens of millions of yuan of a + round financing and built an integrated intelligent database cloud management platform
Automatic database growth
Set up your own website (13)
Introduction to China Mobile oneos development board
Oracle NetSuite 助力 TCM Bio,洞悉数据变化,让业务发展更灵活
微信表情符号被写入判决书,你发的每个 emoji 都可能成为呈堂证供
达梦数据冲刺科创板,或成A股市场“国产数据库第一股”
SQL必需掌握的100个重要知识点:使用视图
一个人就是一本书
MCU firmware packaging Script Software
R language de duplication operation unique duplicate filter