单片机C语言之指针变量

2023-10-31

单片机C语言变量分别有char型,int型,long型,float型等,它们分别占用内存为1个单元,2单元,4单元,4单元等,另外数组和字符串则占用了内存某段连续的单元。这些变量的共同特征是它们都装的数值。那如果一个变量里面装的不是数值,而是地址,这个变量则称为指针变量。所以指针变量用于存储器的地址号。

那么问题又来了,指针变量占多大内存呢?比如char *p,p指针变量前面用char修饰,莫非占一个单元?再例如 long *r,r指针变量前用long修饰,莫非是占4个单元?我们知道C51中,RAM的地址号是从0到255,ROM则是从0到65535。最大的地址号是正整数65535,显然有两个字节便可装下。因此C51中指针变量自身只占两个单元。

既然如此那这些类型修饰符可以不要?我们知道,指针变量中装的是一个地址,也就是说通过这个地址,我便可以找到这个地址中的信息。如果指针指向的是一个char型变量,那么其通过指针(装载char型变量的地址)我找到了这个变量。但如果是指向一个float型变量呢,如果没有这个float来修饰指针变量,那么我们巡着指针只能找到一个字节的数据,而一个float型有4个字节,显然计算机就分不清是不是该把指针后面的三个字节视为一个完整的数据。所以指针变量前面的类型修饰符不是用于修饰指针变量自身所占用的地址数量,而是用于修饰指针变量中所存储的地址与后续地址之间的关联情况。

接下来我们用一个实验来感受下指针的用法。

实验、从单片机发送字符串0123456789到桌面串口调试助手。

#include "reg51.h"
#define u16 unsigned int
#define u8 unsigned char

void delay(u16 x)
{
	while(x--);
}

void Uart_Init() //串口初始化
{
	SCON=0x50; //8位异步模式
	TMOD|=0x20;	//定时器1工作方式2
	TH1=253;//9600bit/s
	TR1=1;
}

void Send_Byte(u8 dat)	  //串口发送一个字节
{
	SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器
	while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位
	TI=0;
}

 void Send_String(u8 *str)	 //发送一个字符串	*str为字符串第一个字符的地址
 {
	while(*str)
	{
		Send_Byte(*str);
		str++;
	}

 }

void main()
{
	Uart_Init();
	while(1)
	{
	   Send_String("0123456789");
	   Send_Byte(10); //回车键
	   delay(60000);
	   delay(60000);
	}
}

从仿真串口接收器来看,这个程序运行得很好。现在我把void Send_String(u8 *str)修改为void Send_String(u16 *str),重新编译并仿真,运行得到


13579?跟着一串乱码,这又是为什么?u16是一个无符号int型,Send_String函数每次会取两个单元作为一个数传进来,进入while循环后,第一次就取"0"*256+"1"传给了Send_Byte函数,而Send_Byte只能装下u8型即一个单元数据,就就是高位的0要溢出,就只剩下1了。所以一直取到了9,之后因为while(*str),继续取字符串后续的内存单元,而这些内存单元里面是什么并不确定,所以显示乱码。

同样我们可以尝试void Send_String(long *str)等等。另外补充一个知识点,定义chara; char *p; p=&a; 其中&是C语言求首地址运算符。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机C语言之指针变量 的相关文章

随机推荐

  • 写一段js代码,完成字段校验规则:字段的长度必须介于6-20位之间,必须包含大小写字母和数字。...

    var regex new RegExp a z A Z 0 9 a zA Z0 9 6 20 if regex test fieldValue 校验通过 else 校验不通过
  • Dynamics 365 自动化发布工具Spkl介绍

    本篇主要是为了后面讲述CI CD时用到的工具做一个说明 先奉上spkl的github地址 没听说过的可以去查看下 挺不错的工具 我们主要用这个工具来部署WebResource Plugin和Workflow Activities 以及后续的
  • 一篇搞定SpringCloud面试(两万字)

    本文来自一位非常卷的在校学生写的学习笔记 哎 这样太卷了 作为一个苦逼的在读大学生 又要面临半年一度的期末考试了 因为上课没听 我啥都不会 什么通信原理 单片机 饶了我吧 给你们看看我上课在干啥你就知道我为啥啥都不会了 上课笔记 emmm
  • 群晖 NAS WebDAV服务手机ES文件浏览器远程访问【无公网IP内网穿透】

    iOS开发上架主页 在强者的眼中 没有最好 只有更好 我们是移动开发领域的优质创作者 同时也是阿里云专家博主 关注我们的主页 探索iOS开发的无限可能 我们与您分享最新的技术洞察和实战经验 助您在移动应用开发领域取得成功 欢迎访问我们的微信
  • 【YOLO v7】论文笔记

    YOLO v7 论文笔记 文章地址及源码 文章 https arxiv org abs 2207 02696 源码 https github com WongKinYiu yolov7 研究背景及主要贡献 针对目标群体 执行实时目标检测的计
  • docker安装seata1.5.2及其使用

    前言 最近进行了seata的安装和使用 对照网上的文章和文档进行安装配置使用的过程中绕了不少弯路 现在完成工作之后写一篇博文对此进行总结和记录 直接上案例 首先要注意Spring Cloud Alibaba Spring Cloud Spr
  • 了解并使用Xposed 框架神器

    什么是Xposed框架 Xposed 框架是个神器 帮助文档 关于Xposed框架的安装以及使用 https sspai com post 24538 Xposed下载地址以及模块库 https repo xposed info modul
  • 使用Qt Creator开发动态链接库,并在程序中调用(动态链接库)

    在 QT 中 一般将驱动 动态库 dll文件一概而论 一路下一步 至工程建立 dynamiclibrary h ifndef DYNAMICLIBRARY H define DYNAMICLIBRARY H include dynamicl
  • 以日期作为ts切片文件名问题的解决过程

    一 需求 EasyDarwin使用FFmpeg来保存流媒体 以多个ts分片形式存在 但由于EasyDarwin调用FFmpeg命令时 没有对生成名字做处理 所以默认生成的ts文件名都是out0 ts out1 ts 这种名称意义不大 需要以
  • 【华为OD机试真题 Java】最长连续子序列

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • 22款常用微信小程序UI框架推荐!

    22个好看 常用的微信小程序UI组件库推荐 1 WeUI 地址 https developers weixin qq com miniprogram dev extended weui 预览码 2 ColorUI 地址 https gith
  • flutter 数据持久化之sqflite

    sqflite 是一款轻量级的关系型数据库 类似SQLite 支持iOS和Android 适用于存储数据库 表类型的数据 使用 添加依赖 dependencies flutter sdk flutter sqflite插件 sqflite
  • html怎么在网页标题栏上添加图标

    需求 像下图这样给网页标题栏加个图标 方法 需要先把图片格式转换为 ico类型 在这个网址在线转换很方便 https www easyicon net covert 在加一行来显示图标 注意 如果加入了没有效果 检查一下路径是否正确 文件名
  • Linux安装rsync命令失败,rsync 常见错误与解决方法整理

    我们都是通过错误日志查看 在rsyncd log里面或 err文件里面 大家可以用记事本打开查看 注意windows下面我们需要给SvcwRsync用户 管理同步目录的所有权限 基本上这样就可以了 问题一 ERROR chroot fail
  • MySQL基本原理以及框架图

    数据库的定义 数据库简单来说是本身可视为电子化的文件柜 存储电子文件的所处 用户可以对文件 的数据运行新增 截取 更新 删除等操作 数据库指的是以一定的方式存储在一起 能为多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 数
  • 反转链表:双指针法

    给你单链表的头节点 head 请你反转链表 并返回反转后的链表 指针 快慢指针 pre指向前一个节点 cur指向当前节点 temp用于保存当前节点的下一个节点 Definition for singly linked list public
  • Echarts柱状图设置柱间距不生效

    由于要做进度条样式的柱状图 如图所示 所以想做点柱子之间的间距 于是设置barGap代码配置如下 这里是错误示范 series name type bar data this downLoadChartsData seriesData ba
  • win10VirtualBox没有64位选项

    Windows10中Virtualbox没办法选择和安装64位的Linux系统 2017 03 08 十有三 0 浏览 5080 操作系统与应用 Windows系统 Linux 明明在公司的WIN7系统中使用Virtualbox就可以安装6
  • 一文详解shell 脚本语言的基本结构,万字长文,建议收藏

    2 1 shell脚本的用途 自动化常用命令 执行系统管理和故障排除 创建简单的应用程序 处理文本或文件 2 2 shell脚本基本结构 shell脚本编程 是基于过程式 解释执行的语言 编程语言的基本结构 各种系统命令的组合 数据存储 变
  • 单片机C语言之指针变量

    单片机C语言变量分别有char型 int型 long型 float型等 它们分别占用内存为1个单元 2单元 4单元 4单元等 另外数组和字符串则占用了内存某段连续的单元 这些变量的共同特征是它们都装的数值 那如果一个变量里面装的不是数值 而