【C语言】十六进制、二进制、字节、位、指针、数组

【C语言】十六进制、二进制、字节、位


文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、十六进制、二进制、字节、位
  • 二、变量、指针、指针变量
  • 三、数组与指针
  • 四、指针自加运算
  • 五、二维数组与指针
  • 六、指向指针的指针
  • 七、指针变量作为函数形参
  • 八、函数指针
  • 九、函数指针数组
  • 十、参考文献
  • 总结

前言

使用工具:
1.控制器:STM32F103C8T6
2.仿真器:STLINK
3.C Primer Plus 第六版-1


提示:以下是本篇文章正文内容,下面案例可供参考

一、十六进制、二进制、字节、位

u16 A_Parameter[10],B_Parameter[10],Flash_Parameter[10];  //

在C语言或类似的环境中,u16 通常被定义为 unsigned short,这意味着它是一个无符号的16位整型数据。由于一个字节包含8位,因此 u16 类型的数据占用2个字节。

对于数组 u16 A_Parameter[10],它包含了10个 u16 类型的元素。每个元素占用2个字节,因此整个数组占用的字节数为:

10 元素×2 字节/元素=20 字节
所以,u16 A_Parameter[10] 占用了20个字节。

A_Parameter[0] 是数组 A_Parameter 的第一个元素,其类型为 u16,即 unsigned short。由于 u16 是一个16位的无符号整型,它占用2个字节。

因此,A_Parameter[0] 占用2个字节。
在这里插入图片描述

#define FLASH_SAVE_ADDR  0X0800E000 	

通过仿真器回读芯片FLASH中0X0800E000地址
十六进制表示

31 00 00 00 03 00 04 00 

A_Parameter[0] 占据两个字节,
一个字节占据8位,
十六进制表示0x31 00,
二进制表示0011 0001 0000 0000,
按位表示共有十六个0和1的位组成

在这里插入图片描述

二、变量、指针、指针变量

使用”&”来获取普通变量的地址
&变量名取得变量地址后就可以赋值给指针变量
这个代码里,我们定义了一个变量a, 定义了一个指针变量p。
我们通过运算符&把变量a的内存地址赋值给变量p,所以p指向了变量a的内存存储地址。
通过指针变量来改变变量a的值,因为指针变量p指向的是变量a的地址,所以改变指针变量p指向内存地址的数据就可以改变变量a的值。

unsigned char a ;//
unsigned char *p ;//
void Flash_Write(void)
{static unsigned int date=0;//¾²Ì¬Êý¾Ý£¬²»Ë溯Êý½øÈë°ÑÊý¾ÝÇå³ýif(++date==65535)date=0;//Êý¾Ý×Ô¼ÓB_Parameter[0]=M1.speed;//M1.speed//date	B_Parameter[1]=M2.speed;	B_Parameter[2]=3;	B_Parameter[3]=4;	printf("Êý¾ÝÀàÐ͵ĴóС\r\n");	printf("char=%d,int=%d,float=%d,double=%d\r\n",sizeof((unsigned char)B_Parameter[0])\,sizeof((unsigned int)B_Parameter[1])\,sizeof((float)B_Parameter[2])\,sizeof((double)B_Parameter[3]));printf("\r\n");	a=10;p=&a;//È¡µØÖ·printf("±äÁ¿aµÄµØÖ·\r\n");	printf("&a=0x%x\r\n",&a);	printf("p=0x%x\r\n",p);printf("&p=0x%x\r\n",&p);	printf("\r\n");		printf("±äÁ¿aµÄÖµ\r\n");	printf("a=%d\r\n",a);printf("*p=%d\r\n",*p);	printf("\r\n");		printf("ͨ¹ýÖ¸Õë±äÁ¿¸Ä±ä±äÁ¿aµÄÖµ\r\n");	*p=11;	printf("a=%d\r\n",a);	printf("*p=%d\r\n",*p);		printf("\r\n");		printf("ͨ¹ýÄÚ´æµØÖ·¸Ä±ä±äÁ¿aµÄÖµ\r\n");	*(unsigned int *)0x200005ac=12;	printf("a=%d\r\n",a);	printf("*p=%d\r\n",*p);		printf("\r\n");			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)B_Parameter,4);	
}

在这里插入图片描述

在这里插入图片描述

三、数组与指针

buff默认的是数组下标为0元素的存储地址,buff和&buff[0]是同一个内存地址,只是写法不一样
unsigned char buff[5]={1,2,3,4,5};
unsigned char 表示占用一个字节,即buff数组中所有成员各占一个字节,如buff0]=0x01,占用一个字节

unsigned char buff[5]={1,2,3,4,5};
unsigned char *p1;
unsigned char *p2;p1=buff;p2=&buff[0];printf("buff=0x%x\r\n",buff);	printf("&buff=0x%x\r\n",&buff[0]);	printf("p1_addr=0x%x\r\n",p1);	printf("p2_addr=0x%x\r\n",p2);	printf("\r\n");	printf("buff[0]=%d\r\n",buff[0]);	printf("*p1=%d\r\n",*p1);	printf("*p2=%d\r\n",*p2);	

在这里插入图片描述
在这里插入图片描述

四、指针自加运算

普通变量加减的是数值,而指针变量加减的是地址
首先,代码打印出数组buff每个元素的地址和值。
然后,指针p1被初始化为指向数组的第一个元素(&buff[0])。
接着,通过递增指针p1,代码遍历数组的每个元素,并打印出每个元素的地址和值。

#include <stdio.h>  int main() {  unsigned char buff[5] = {1, 2, 3, 4, 5};  unsigned char *p1;  // 打印数组每个元素的地址和值  printf("&buff[0]=0x%x buff[0]=%d\r\n", &buff[0], buff[0]);  printf("&buff[1]=0x%x buff[1]=%d\r\n", &buff[1], buff[1]);  printf("&buff[2]=0x%x buff[2]=%d\r\n", &buff[2], buff[2]);  printf("&buff[3]=0x%x buff[3]=%d\r\n", &buff[3], buff[3]);  printf("&buff[4]=0x%x buff[4]=%d\r\n", &buff[4], buff[4]);  p1 = &buff[0]; // 指针p1指向数组的第一个元素  // 使用指针遍历数组  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  printf("\r\n");  return 0;  
}

在这里插入图片描述
在这里插入图片描述

五、二维数组与指针

首先,代码打印出二维数组buff2每个元素的地址和值。
然后,指针p1被初始化为指向数组的第一个元素(&buff2[0][0])。
接着,通过递增指针p1,代码遍历数组的每个元素,并打印出每个元素的地址和值。

#include <stdio.h>  int main() {  unsigned char buff2[2][3] = {{1, 2, 3}, {4, 5, 6}};  unsigned char *p1;  printf("五、二维数组与指针\r\n");  p1 = &buff2[0][0];  // 打印数组每个元素的地址和值  printf("&buff2[0][0]=0x%x buff2[0][0]=%d\r\n", &buff2[0][0], buff2[0][0]);  printf("&buff2[0][1]=0x%x buff2[0][1]=%d\r\n", &buff2[0][1], buff2[0][1]);  printf("&buff2[0][2]=0x%x buff2[0][2]=%d\r\n", &buff2[0][2], buff2[0][2]);  printf("&buff2[1][0]=0x%x buff2[1][0]=%d\r\n", &buff2[1][0], buff2[1][0]);  printf("&buff2[1][1]=0x%x buff2[1][1]=%d\r\n", &buff2[1][1], buff2[1][1]);  printf("&buff2[1][2]=0x%x buff2[1][2]=%d\r\n", &buff2[1][2], buff2[1][2]);  printf("\r\n");  // 使用指针遍历数组  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  p1++;  printf("p1=0x%x *p1=%d\r\n", p1, *p1);  printf("\r\n");  return 0;  
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

六、指向指针的指针

指针变量分为存储地址和指向地址

a的初始值是*a,是10,存储地址是&a,是0x200005ac
p1的存储地址是&p1,是0x200005bc;指向地址是p1,是0x200005ac,是a的存储地址
p3的存储地址是&p3,是0x200005cc;指向地址是p3,是0x200005bc,是p1的存储地址
*p3是取p3的值,取0x200005bc这个地址的值,而这个地址的值是一个地址,是0x200005ac,是a的存储地址
**p3是取*p3的值,即取0x200005ac这个地址的值,是10

输出结果解释:

&a、&p1、&p3分别打印出变量a、指针p1、指针p3的内存地址。
a=10给变量a赋值。
p1=&a使指针p1指向变量a。
p3=&p1使指针p3指向指针p1。
接下来的几行打印出变量和指针的地址及它们所指向的值,展示了如何通过指针和指向指针的指针来访问和操作变量。

#include <stdio.h>  int main() {  unsigned char a;  unsigned char *p1;  unsigned char **p3;  printf("六、指向指针的指针变量\r\n");  printf("&a=%p\r\n", (void*)&a); // 打印变量a的地址  printf("&p1=%p\r\n", (void*)&p1); // 打印指针p1的地址  printf("&p3=%p\r\n", (void*)&p3); // 打印指针p3的地址  printf("\r\n");  a = 10;  p1 = &a;  p3 = &p1;  printf("&a=0x%x a=%d\r\n", &a, a); // 打印变量a的地址和值  printf("&p1=0x%x p1=0x%x\r\n", &p1, p1); // 打印指针p1的地址和值(即变量a的地址)  printf("&p3=0x%x p3=0x%x\r\n", &p3, p3); // 打印指针p3的地址和值(即指针p1的地址)  printf("*p1=%d\r\n", *p1); // 打印指针p1指向的值(即变量a的值)  printf("*p3=0x%x\r\n", *p3); // 打印指针p3指向的值(即指针p1的值,也就是变量a的地址)  printf("**p3=%d\r\n", **p3); // 打印指针p3指向的指针所指向的值(即变量a的值)  return 0;  
}

在这里插入图片描述
在这里插入图片描述

七、指针变量作为函数形参

代码解释:
#include <stdio.h>:包含标准输入输出库,以便使用printf函数。
void TEST7(unsigned char *p4):定义了一个函数TEST7,它接收一个指向unsigned char类型的指针p4作为参数。
在TEST7函数内部,*p4 = 5;语句将指针p4指向的值修改为5。
在main函数中,首先声明了一个unsigned char类型的变量a,并初始化为1。
TEST7(&a);调用TEST7函数,并将变量a的地址作为参数传递。这样,TEST7函数内的修改会影响到main函数中的a变量。
printf(“a=%d\r\n”, a);打印变量a的值,此时a的值已经被TEST7函数修改为5。
这段代码演示了如何通过指针参数在函数间共享和修改数据。

#include <stdio.h>  void TEST7(unsigned char *p4)  
{  *p4 = 5;  
}  int main() {  unsigned char a;  printf("七、指针变量作为函数参数 \r\n");  a = 1;  TEST7(&a);  printf("a=%d\r\n", a);  printf("\r\n");  return 0;  
}

在这里插入图片描述

八、函数指针

定义函数指针:

unsigned char (*func)(unsigned char,unsigned char);

这行代码定义了一个函数指针func,它指向一个接受两个unsigned char类型参数并返回一个unsigned char类型结果的函数。
定义函数:

unsigned char TEST8(unsigned char v1,unsigned char v2)  
{  return (v1+v2);  
}

这行代码定义了一个函数TEST8,它接受两个unsigned char类型的参数v1和v2,并返回它们的和。

使用函数指针调用函数:

func = TEST8;  
a = (*func)(1,2);

首先,将函数TEST8的地址赋给函数指针func。然后,通过函数指针func调用函数TEST8,并传递参数1和2。函数的结果被赋值给变量a。

打印结果:

printf("a=%d\r\n",a);

这行代码打印变量a的值,即函数TEST8的返回值。

#include <stdio.h>  unsigned char (*func)(unsigned char,unsigned char);  unsigned char TEST8(unsigned char v1,unsigned char v2)  
{  return (v1+v2);  
}  int main()  
{  unsigned char a;  printf("函数指针示例\r\n");  func = TEST8;  a = (*func)(1,2);  printf("a=%d\r\n",a);  printf("\r\n");  return 0;  
}

在这里插入图片描述

九、函数指针数组

定义函数指针数组:

void (*TEST9[3])()={func1,func2,func3};

这行代码定义了一个名为TEST9的函数指针数组,它包含3个元素,每个元素都是一个指向无参数、无返回值(void类型)函数的指针。数组在定义时就被初始化为包含func1、func2和func3这三个函数的地址。

定义函数:

void func1() { printf("func1 \r\n"); }  
void func2() { printf("func2 \r\n"); }  
void func3() { printf("func3 \r\n"); }

这三行代码定义了三个无参数、无返回值的函数func1、func2和func3,它们分别打印出各自的名称。

使用函数指针数组调用函数:

TEST9[0]();  
TEST9[1]();  
TEST9[2]();

这三行代码通过函数指针数组TEST9来调用func1、func2和func3这三个函数。数组的每个元素都是一个函数指针,通过在该指针后面加上()来调用对应的函数。

打印提示信息:

printf("¾Å¡¢º¯ÊýÖ¸ÕëÊý×é \r\n");

这行代码打印出一条提示信息,表明接下来将演示函数指针数组的使用。注意,这里的文本“¾Å¡¢”可能是某种特定编码下的字符,它在正常的ASCII或UTF-8编码下不会显示为预期的文本。在实际编程中,应使用可打印的ASCII或UTF-8字符来编写代码和注释。

#include <stdio.h>  void func1() { printf("func1 \r\n"); }  
void func2() { printf("func2 \r\n"); }  
void func3() { printf("func3 \r\n"); }  void (*TEST9[3])() = {func1, func2, func3};  int main() {  printf("函数指针数组示例 \r\n");  TEST9[0]();  TEST9[1]();  TEST9[2]();  return 0;  
}

在这里插入图片描述

十、参考文献

位、字节、16进制
c语言指针用法及实际应用详解,通俗易懂超详细!
VSCode中C语言程序输出时,控制台出现中文乱码的问题
VSCode编译C语言代码

总结

本文仅仅简单介绍了【C语言】十六进制、二进制、字节、位验证,评论区欢迎讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统功能性能优化:从问题定位到解决方案的系统性分析

引言 在现代软件系统中&#xff0c;性能优化是确保系统稳定、响应迅速和资源高效利用的关键。面对复杂的系统架构和业务逻辑&#xff0c;进行性能优化往往需要遵循一系列系统性的步骤&#xff0c;以确保问题被准确识别&#xff0c;解决方案被有效实施。以下是一套专业的系统功…

(四)Kafka离线安装 - Kafka下载及安装

Kafka官方下载地址&#xff1a;Apache Kafka 这时候下载安装版本。 我这里的安装目录在 /usr/local/ cd /usr/local/# 创建目录 mkdir kafka cd kafka mkdir kafka_log 把下载的压缩包&#xff0c;放入到/usr/local/kafka/目录下&#xff0c;解压。 # 解压 tar -zxvf kafka…

前端踩坑记录:javaScript复制对象和数组,不能简单地使用赋值运算

问题 如图&#xff0c;编辑table中某行的信息&#xff0c;发现在编辑框中修改名称的时候&#xff0c;表格中的信息同步更新。。。 检查原因 编辑页面打开时&#xff0c;需要读取选中行的信息&#xff0c;并在页面中回显。代码中直接将当前行的数据对象赋值给编辑框中的表单对…

[从0开始AIGC][LLM]:LLM中Encoder-Only or Decoder-Only?为什么主流LLM是Decoder-Only?

LLM中Encoder-Only or Decoder-Only & 为什么主流LLM是Decoder-Only&#xff1f; 文章目录 LLM中Encoder-Only or Decoder-Only & 为什么主流LLM是Decoder-Only&#xff1f;1. 什么是Encoder-only、Decoder-Only2. 为什么当前主流的LLM都是Decoder-only的架构低秩问题 …

秋招/春招投递公司记录表格

最近在准备秋招&#xff0c;在各个平台投递秋招简历&#xff0c;什么官网&#xff0c;邮箱&#xff0c;boss&#xff0c;应届生各个平台上&#xff0c;投递的平台比较多&#xff0c;比较乱&#xff0c;因此自己想将这些平台投递记录都收集到一个表格上&#xff0c;所以在腾讯文…

bladeX默认审批流flowable如何设置

下面就是流程图必须得写 ${taskUser} 你要配什么 就给审批流的service传什么

VSCode必备插件!快看过来!

同学同学&#xff0c;你是不是也很头疼VSCode不知道安装什么插件啊&#xff1f;尤其是萌新小白&#xff0c;更是一头雾水&#xff0c;那就快来一起看看吧~我帮你整理了一些非常实用的插件&#xff0c;安装上它们&#xff0c;你的开发体验会大大提升&#xff01; 1. Chinese (S…

Call openai-node in the backend or call https in the frontend?

题意&#xff1a;在后端调用 openai-node 还是在前端调用 https&#xff1f; 问题背景&#xff1a; I have a web application by ReactJS and Nodejs. This application calls OpenAI APIs. 我有一个使用 ReactJS 和 Node.js 开发的 Web 应用程序。这个应用程序调用 OpenAI …

零基础入门转录组数据分析——预后模型之lasso模型

零基础入门转录组数据分析——预后模型之lasso模型 目录 零基础入门转录组数据分析——预后模型之lasso模型1. 预后模型和lasso模型基础知识2. lasso预后模型&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理2. 2 构建lasso预后模型2. 3 提取Lasso预后基因2. 4 计算风…

Pyqt5高级技巧:多线程任务、窗体交互、常用控件介绍(含基础Demo)

目录 一、多线程任务和多窗体交互 二、增删改查Demo 三、UI设计 【css效果代码对照表】 【实现效果】 【实现代码】 【常见问题】 Q1&#xff1a;工具栏怎么加&#xff0c;资源图片怎么加 Q2&#xff1a;控件被背景染色怎么办&#xff1f; Q3&#xff1a;QTdesigner有…

LVS的加权轮询算法

http://kb.linuxvirtualserver.org/wiki/Weighted_Round-Robin_Scheduling 加权轮循调度是为了更好地处理不同处理能力的服务器。每个服务器都可以被分配一个权重&#xff0c;一个表示处理能力的整数值。权值较高的服务器比权值较低的服务器首先接收到新连接&#xff0c;权值较…

<Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第七篇博…

记一次学习--webshell绕过(利用清洗函数)

目录 样本 样本修改 样本 <?php $a array("t", "system"); shuffle($a); $a[0]($_POST[1]); 通过 shuffle 函数打乱数组,然后通过$a[0]取出第一个元素&#xff0c;打乱后第一个元素可能是t也可能是system。然后再进行POST传参进行命令执行。 这里抓…

部署Rancher2.9管理K8S1.26集群

文章目录 一、实验须知1、Rancher简介2、当前实验环境 二、部署Rancher1、服务器初始化操作2、部署Rancher3、登入Rancher平台 三、Rancher对接K8S集群四、通过Rancher仪表盘部署Nginx服务1、创建命名空间2、创建Deployment3、创建Service 一、实验须知 1、Rancher简介 中文官…

【自由能系列(中级),代码模拟】预测编码的核心:三个关键方程式的详解

预测编码的核心&#xff1a;三个关键方程式的详解 ——探索预测编码背后的数学原理与应用 核心结论&#xff1a;预测编码是一种基于贝叶斯定理的理论框架&#xff0c;它通过三个关键方程式描述了大脑如何处理和解释来自环境的信号。这些方程式分别建立了贝叶斯定理的简化形式、…

9月新机首发:骁龙芯片+超大电池,游戏玩家的终极选择

随着秋风送爽的9月到来&#xff0c;智能手机和电子设备市场也迎来了新一轮的热潮。8月份的新机发布热潮刚刚退去&#xff0c;9月份的新机已经迫不及待地揭开了神秘的面纱。在众多备受期待的产品中&#xff0c;红魔品牌抢先官宣&#xff0c;两款全新的游戏平板将在9月5日正式亮相…

论文速读|通过人类远程操作的深度模仿学习框架:人型机器人的行走操纵技能

项目地址&#xff1a;Deep Imitation Learning for Humanoid Loco-manipulation through Human Teleoperation 本文详细介绍了 TRILL&#xff08;Teleoperation and Imitation Learning for Loco-manipulation&#xff09;框架&#xff0c;它是一个用于人型机器人行走操纵技能训…

OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在图像上绘制指定的文本字符串。 cv::putText 函数在图像上绘制指定的文本字符串。无法使用指定字体渲染的符号会被问号&#xff08;?&#xff…

简单梯形问题

如下图&#xff0c;ABCD是一个梯形&#xff0c;E是AD的中点&#xff0c;直线CE把梯形分成甲、乙两部分&#xff0c;其面积之比为5:2&#xff0c;那么上底AB与下底CD的长度之比是&#xff08;&#xff09;。 A 2&#xff1a;5 B 3&#xff1a;5 C 3&#xff1a;4【正确答案】 D …

LLM:推理加速相关的结构优化

对于 LLM&#xff0c;加速推理并降低显存&#xff0c;是两个至关重要的问题。本文将从 Key-Value Cache 出发&#xff0c;介绍两种相关的模型结构改进。分别是 ChatGLM 系列使用的 Multi-Query Attention&#xff08;MQA&#xff09; 和 LLama 系列使用的 Grouped-Query Attent…