Keil C51 中指针的使用
2011-11-02 23:51
393 查看
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只有一个字节,i
char 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的地址内容赋值r
a=*((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中函数指针的使用》
http://www.docin.com/p-259503750.html
指针是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只有一个字节,i
char 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的地址内容赋值r
a=*((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中函数指针的使用》
http://www.docin.com/p-259503750.html
相关文章推荐
- Keil C51 中的函数指针使用注意事项
- Keil C51 中的函数指针使用注意事项
- [Keil-C51]在Keil C51中使用sizeof()的一点问题记录
- keil c51 不能使用:Go to Definition of....的解决方法
- Keil C51软件的使用教程
- Keil C51中直接使用二进制数的方法
- 使用KEIL C51实现的简单合作式多任务操作系统内核
- 单片机C语言指针意义浅析—Keil-C51
- 单片机C51 - 16 x 16点阵使用指针显示汉字
- Keil C51软件的使用教程
- KeilC51使用详解:第一章 Keil C51开发系统基本知识
- XDATA相关 --- c51的指针的使用
- KeilC51使用详解:第二章 Keil C51软件使用详解
- Keil C51 中的函数指针和再入函数
- KeilC51使用详解:第三章 Keil C51 vs 标准C
- [51单片机] Keil C51中变量的使用方法详解
- Keil C51中静态库的生成与使用
- Keil C51编译器的使用
- 搭建使用 RTX51-Tiny 的 C51 Keil 项目环境
- keil C51使用串口时程序跑死的问题