单片机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语言求首地址运算符。
关键字:单片机 C语言 指针变量
引用地址:
单片机C语言之指针变量
推荐阅读最新更新时间:2024-03-16 16:01
基于DHT11的实验室多点温湿度报警系统设计
以单片机为控制核心,采用DHT11温湿度传感器,12864LCD显示模块,实现了实验室多点温湿度参数的实时采集、显示和超限报警功能。系统的优点为单总线串口通信,使系统结构简化,节约了单片机资源,易于系统的功能扩展。
0 引言
实验室作为学生实验和科研活动的重要场所,实验室环境指标是否符合要求,直接关系到实验能否顺利进行,乃至实验的成败,特别是对于医学院校生物、生理等实验课程,都要求稳定的实验室环境,所以对于实验室环境参数的检测就显得尤为重要。传统的实验室温度湿度检测方案基本使用温湿度传感器采集信号,经放大、滤波、校准、模数转换、显示等硬件电路实现,这种方案由于硬件系统复杂,调试困难,使用时系统小元件故障就可能造
[嵌入式]
PIC单片机4位16进制数除于4位16进制数子程序
;************************************************************** ; 除法子程序 ;/************************************************************* CF1 MOVLW 0FFH;被除数 MOVWF 70H ;被除数高8位寄存器 MOVLW 0FFH;被除数 MOVWF 71H;被除数低8位寄存器 MOVLW 00H MOVWF 72H ;余数高8位寄存器 MOVLW 00H MOVWF 73H ;余数低8位寄存器 MOVLW 00H MOVWF 74H;商高8位寄存器 MO
[单片机]
基于MMA8452Q传感器的计步器抗干扰设计
伴随着人们生活质量和科技水平的提高,辅助锻炼设备不断出现,计步器就是一种日常锻炼监测器,通过记录人们行走的步数,监测自己的健身强度,方便实用。加速度传感器可用于间接步数检测。由于近年来MEMS加速度传感器发展很快,并具有价格低、体积小、功耗低、精度高的特点,利用其来设计电子计步器,已经多有报道,市场上也有产品出售。目前存在的主要问题是计步精度,尽管在加速度的检测上传感器的精度高,但是计步却受到诸多干扰影响,精度难以保证。本文以MEMS加速度传感器。MMA8452Q为基础,研究其工作特性,针对计步干扰信号特点,采取抗干扰措施完成电子式计步器设计。 1 系统方案设计 1.1 基于加速度信号检测的计步器原理 距离、速度、加速度等都
[单片机]
基于单片机的多路无线温度检测系统
温度在人类日常生活中扮演着极其重要的角色,同时在工农业生产过程中,温度检测具有十分重要的意义。现阶段温度检测主要是有线定点温度检测,其温度检测原理为单片机利用温度传感器检测温度,并在数码管或LCD 上进行温度显示。同时由于系统没有报警功能,故需要人为来判断是否需要进行升温或者降温,这使系统的检测丧失了实时性。另外,在某些环境恶劣的工业环境,以人工方式直接操作设置仪表测量温度也不现实,因此采用无线方式进行温度检测尤为必要。 目前有些设计能够实现无线温度采集,但功耗过高是其最大的缺点。在实际温度控制过程中既要求系统具有稳定性、实时性,又需要使系统功耗低及保证温度的均匀性,因此设计一种低功耗的多点无线温度检测系统很有意义。本文
[单片机]
通常用法的 51单片机 UART 0 初始化程序
#define MHz 1000000U // 定义 MHz #define gCLK (22.1184*MHz) // 系统时钟频率 #define UART_BAUD 9600 // 定义所用的波特率 // 串行通讯初始化函数,在程序开始时调用 void serial_init(void) { SCON = 0x50; // Mode 1: 8-bit UART, 允许接收 TMOD |= 0x20; // 定时器1 Mode 2: 8-Bit reload PCON = 0x80; // SMOD = 1 TH1 = 256 - (uchar
[单片机]
AVR单片机学习C语言的流水灯验证
AVR 的IO口简介与寄存器的概念 一、何谓“寄存器” 寄存器就是RAM中的一些特殊单元,映射片上外设的特殊功能 二、何谓“IO口” 可以将 0 与1转换为电压信号的端口 单片机中最常用的TTL电平:0V代表“0”,+5V 代表“1” Mega16有4个IO口,PA,PB,PC,PD 三、IO口的性能指标 灌电流能力:能够流入IO口的最大电流 拉电流能力:能够从IO口流出的最大电流 上拉电阻与下拉电阻 最大输入电压 IO口的两种状态 如上图(有个选择开关实际电路中不存在的为了好理解才给出的)输出就是 要么给个5V 要么给个地 0V 就是输出0 和 1 上图输入模型 理想的输入
[单片机]
什么是51单片机最小系统
1.什么是51单片机 51 内核单片机是 指兼容Intel 的8051指令系统的单片机统称;从诞生到现在的几十年时间,已成为一款经过市场考验、成熟的芯片产品。目前国内也众多51单片机厂家,且还有众多带51内核,用于各种不同场景的专用类单片机。 51单片机内部框架: 以下以STC89C52单片机为例,其内部总体结构其基本特性如下: 8位CPU、4-8k 字节 ROM、128 字节 RAM、21 个特殊功能寄存器32根I/0线、可寻址的 64 字节外部数据、程序存贮空间、2个 16 位定时器计数器中断结构:具有二个优先级、五个中断源、一个全双工串行口、位寻址(即可对寄存器进行位操作)功能,能按位进行逻辑运算的位处理器。 除 1
[单片机]