Keil C51 中指针的使用

发布者:不见南师久最新更新时间:2016-12-16 来源: eefocus关键字:Keil  C51  指针 手机看文章 扫描二维码
随时随地手机看文章

  指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用。

  keil51的指针,包含两种指针:普通指针,兼容标准C;内存特殊指针

  1 普通指针

char * ptr;          //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节char * xdate ptr;    //指针存储在片外,xdate 是修饰ptr的char * idate ptr;    //指针存储在片内,指针指向的数据可以是片内也可以是片外

  2 内存特殊指针

char xdate * ptr;        //指针存储占字节不一定,根据变量存储类型不同不一样,xdate是修饰 *的,也就是数据存储在片外,此时ptr占两个字节char idate * ptr;        //数据是片内,指针ptr只有一个字节,ichar xdate * date ptr;   //指针在片内,数据在片外idata是和char 一起修饰数据的

  总结:内存特殊指针比一般指针运行快,因为数据存储位置知道,编译时可以优化。指针类型可以转换,但容易出错。所以编程时最好对数据和对指针的修饰都要。

补充:
c51存储类型有:code,data,bdata,idata,pdata,xdata
片内ROM部分:code,8051的只读存储器,程序代码保存的地方
片内RAM部分:
  data:片内RAM的低128b,直接寻址方式
  idata:片内所有的RAM,只能使用间接寻址访问;
  bdata:片内RAM可位寻址空间,0X20--0X2F,可位寻址访问。
片外RAM部分:
  xdata:片外RAM全部64K空间,可用DPTR16位指针间接寻址。
  pdata:片外RAM的265B,0X00--0XFF,使用R0,R1间接寻址 

3 指针的绝对地址赋值

char xdata * XROM;
XROM=(char xdata *)0xB012;    //指针XROM的值就是0xB012,(char xdata *)表示强制类型转换*XROM='r';                    //给0xB012的地址内容赋值ra=*((char xdata *)0xB012);    //等同于a=*XROM,此时a='r'

4 函数的指针

复制代码

int main(void)
{
    ( ( void (code *)(void) ) 0x2000 )();    return 0;
}//主函数执行位于0x20000地址的程序代码,( void (code *)(void) )是指向函数的指针,该函数的类型是无参数无返回类型,对0x2000做强制类型转换。

复制代码

复制代码

void foo(void)
{    return;
}int main(void)
{    void (*pfoo)(void);   //申明函数指针pfoo
    pfoo=foo;             //对该指针赋值,指针指向foo函数代码段
    (*pfoo)();            //通过指针调用其指向的函数,就是运行foo函数
    return 0;
}

复制代码

  对于带参数的函数,函数指针最多能传递3个参数,参数多了需把参数放入结构体,用一个指针指向结构体,指针作为参数传递给函数。

void (* pfun)(char,short,int);    //申明函数指针(* pfun) ('c',0x1234,0x5678);     //调用改函数

函数指针作为函数的参数会出错,此时需要修改调用数参见论文《Keil C51中函数指针的使用》


关键字:Keil  C51  指针 引用地址:Keil C51 中指针的使用

上一篇:keil C51 指针总结
下一篇:Keil C51 Data Overlaying

推荐阅读最新更新时间:2024-03-16 15:25

裸机程序--keil mdk下xc2440按键控制LED
其实只要前面几个回了,熟悉了keil mdk开发环境之后,简单的诸如led和按键的裸机程序其实和51单片机没什么区别了。。。 新建工程,配置GPF0,也就是LED1为输出模式,GPF4,也就是按键1为输入模式; 新建main.c文件,并加入工程,编写代码如下 同样给出 配置,和上次一模一样。。。
[单片机]
C51单片机学习笔记(六)——液晶显示屏的使用
1.LCD1602的认识 液晶显示屏简称液晶、LCD。各种型号的液晶通常是按显示字符的行数或液晶点阵的行、列进行命名的。1602的意思就是每一行显示16个字符,共可以显示2行,常见的液晶还有0801、0802、1601等,这类液晶是字符型液晶,只能显示ASCII码字符。而LCD12864属于图形型液晶,由128*64个像素点构成,可以显示各种图形包括汉字。 LCD1602可显示2行ASCII码字符,每行包括16个5*10点阵(像素),有16个引脚,其实物图如下所示: 2.LCD1602的引脚及其功能 3.LCD模块的内部结构 LCD1602模块的内部结构分为三部分:LCD控制器、LCD驱动器、LCD显示器 LCD控制器
[单片机]
<font color='red'>C51</font>单片机学习笔记(六)——液晶显示屏的使用
C51和MDK的ROM大小及变量绝对地址初始化
#1. C51的ROM大小 Keil编译完之后,显示的Program Size: data=9.0 xdata=8 const=15 code=180,则 The Total ROM(const + code + code-gap + const-gap) is 199BYTE 实际生成的bin文件大小: 在.MAP中的C O D E M E M O R Y 中 code-gap为0,cosnt-gap为4,则const + code + const-gap=15 + 180 + 4 = 199,刚好和实际生成的bin文件大小一致。 #2. C51的ROM大小优化 如果实际编译显示的const + code远小于实际的Bi
[单片机]
<font color='red'>C51</font>和MDK的ROM大小及变量绝对地址初始化
Keil C51单片机中变量的使用方法解析
8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 一、CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在
[单片机]
<font color='red'>Keil</font> <font color='red'>C51</font>单片机中变量的使用方法解析
单片机C51 DATA,XDATA,BDATA,IDATA,CODE存储资源分配
单片机初学者一般对c51语言里的DATA,XDATA,BDATA,IDATA,CODE,不是很清楚,因为在微机的c语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表 普通51系列单片机存储空间资源分配情况 空间名称 地址范围 说明 DATA D:00H~7FH 片内RAM直接寻址区 BDATA D:20H~2FH 片内RAM位寻址区 IDATA I:00H~FFH 片内RAM间接寻址区 XDATA X:0000H~FFFFH 64K片外RAM数据区 CODE C:
[单片机]
51单片机Keil C延时程序的简单研究
以前用汇编语言写单片机程序的时候,这个问题还是相对轻易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: mov r0, #09h loop: djnz r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。假如需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。 现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便
[单片机]
51单片机程序设计中的地址指针及其应用
CS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令: MOVX A,@DPTR MOVX @DPTR,A MOVX A,@RI MOVX @RI,A 其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。 MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。 执行“MOVX A,@DPTR”和“MOVX @DPTR,A”指令时,在读指令代码阶段,由程序计数器(PC)提供A0
[单片机]
指针变量,位带指针,LSB最低有效位······
1指针变量及例子 前面文章【 STM32位带操作 】牵涉到的一个重要知识点就是指针变量。 这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量。 指针变量:指存放地址的变量。 指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》 指针变量的例子 int main(void) { uint32_t *p; p = (uint32_t *)(0x42210184); System_Initializes(); while(1) { *p = 0; TIMDelay_Nms(500); *p = 1; TIM
[单片机]
<font color='red'>指针</font>变量,位带<font color='red'>指针</font>,LSB最低有效位······
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved