×
单片机 > 单片机程序设计 > 详情

Keil C51 中指针的使用

发布时间:2025-03-25 发布时间:
|

  指针是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中函数指针的使用》





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
移植u-boot-2016.11到TQ2440开发板全过程记录