你不得不知的C51指针小结

发布者:rho27最新更新时间:2021-04-30 来源: eefocus关键字:C51  指针小结  指针变量 手机看文章 扫描二维码
随时随地手机看文章

一. 指针变量的定义

指针变量定义与一般变量的定义类似,其形式如下:

数据类型 [存储器类型1] * [存储器类型2] 标识符;


[存储器类型1] 表示被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下:


存储类型I Idata/data/bdata xdata pdata Code 编码值 0x00 0x01 0xFE 0xFF


[存储类型2]用于指定指针本身的存储器空间。


char * c_ptr; int * i_ptr; long * l_ptr;

上述定义的是一般指针,c_ptr指向的是一个char型变量,那么这个char型变量位于哪里呢?这和编译时由编译模式的默认值有关,

如果Menory Model—Variable—Large:XDATA,那么这个char型变量位于xdata区:

如果Menory Model—Variable—Compact:PDATA, 那么这个char型变量位于pdata 区:

如果Menory Model——Variable——Small:DATA,那么这个char型变量位于data区。

而指针c_ptr, i_ptr, l_ptr变量本身位于片内数据存储区中。 char * data c_ptr; int * idata i_ptr; long * xdata l_ptr;

上述定义,c_ptr, i_ptr, l_ptr变量本身分别位于data ,idata,xdata区。 char data * c_ptr; //表示指向的是data区中的char型变量,c_ptr在片内存储区中;

int xdata * i_ptr; //表示指向的是xdata区中的int型变量,i_ptr在片内存储区中;

long code * l_ptr; //表示指向的是code区中的long型变量,l_ptr在片内存储区中; char data * data c_ptr; //表示指向的是data区中的char型变量,c_ptr在片内存储区data中;

Int xdata * idata i_ptr; //表示指向的是xdata区中的int型变量,i_ptr在片外存储区xdata中;

long code * xdata l_ptr; //表示指向的是code区中的long型变量,l_ptr在片内存储区xdata中;


二. 指针应用


int x, j;

int * px, *py;

px=&x; py=&y; *px=0; py=px; *px++<=>*(px++) (*px)++<=>x++ unsigned char xdata * x;

unsinged char xdata * y;

x=0x0456;

*x=0x34 //等价于 mov dptr,#456h ; mov a,#34h; movx @dptr,a unsigned char pdata * x;

x=0x045;

*x=0x34 //等价于 mov r0,#45h ; mov a,#34h; movx @r0,a unsigned char data * x;

x=0x30;

*x=0x34 //等价于 mov a,#34h; mov 30h ,a int *px;

px=(int xdata *)0x4000; //将 xdata 型指针 0x4000 赋给 px,也就是将0x4000强制转换为指向xdata区中的int型变量的指针,将其赋给px。 int x;

x=*((char xdata *)0x4000); //将0x4000强制转换为指向xdata区中的int型变量的指针,从这个地址中取出值赋给变量x。 px=*((int xdata * xdata *)0x4000); //如何分析? px=*((int xdata *xdata *)0x4000);将阴影部分遮盖,这个意思就是将0x4000强制转换为指向xdata区中的X型变量的指针,这个X型变量就是阴影“int xdata *”,也就是0x4000指向的变量类型是一个指向xdata区中的int型变量的指针,即0x4000中放的是另外一个指针,这个指针指向的是xdata区中的int型变量。Px值放的是0x4000中放的那个指针。比如【0x4000】—【0x2000】-0x34。Px=0x2000。 x=**((int xdata * xdata *)0x4000); x中放着0x4000中放的那个指针所指向的值。比如【0x4000】—【0x2000】-0x34。


三. 指针与数组


int arr[10];

int * pr;

pr=arr; // 等价于pr=&arr[0];

这样的话,*(pr+1)==arr[1]; *(pr+2)==arr[2]; *(arr+3)==arr[3]; *(arr+4)==arr[4];

或者 pr[0],pr[1]….代表 arr[0],arr[1]…..

可以*pr++ (等价于*(pr++)),来访问所有数组元素,而*arr++是不行的。因为arr是常量,不能++运算 char * s1

char code str[]=”abcdefg”

s1=str; char *s1=”abcdefg”;


四. 指针与结构体


typedef struct _data_str {

unsigned int DATA1[10];

unsigned int DATA2[10];

unsigned int DATA3[10];

unsigned int DATA4[10];

unsigned int DATA5[10];

unsigned int DATA6[10];

unsigned int DATA7[10];

unsigned int DATA8[10];

}DATA_STR;

//开辟一个外RAM空间,确保这个空间够装你所需要的

xdata uchar my_data[MAX_STR] _at_ 0x0000;

DATA_STR *My_Str;

My_Str=(DATA_STR*)my_data; //把你的结构体指针指向这个数组的开头

以后的操作就这样:

My_Str->DATA1[0]=xxx;

My_Str->DATA1[1]=xxx;

那么你的变量就自然放到XDATA中去了.

注意定义的my_data[MAX_STR],不能随便被操作,它只是开始的时候用来开辟内存用的. struct student

{

char name[20];

int num;

}stu1,stu2; struct student

{

char name[20];

int num;

};

struct student stu1,stu2;

struct student *p;

p=&stu1;

访问成员方法:

A. stu1.num

B. (*p).num; //因为“.”的优先级高于“*”所以要加括号。

C. P->num; struct student stu[10];

struct student * p;

p=stu;


关键字:C51  指针小结  指针变量 引用地址:你不得不知的C51指针小结

上一篇:KEIL编译器C51.EXE的问题
下一篇:51单片机电子时钟C语言程序

推荐阅读最新更新时间:2024-11-08 13:02

单片机60s倒计时c51程序
#include reg51.h #define uchar unsigned char sbit P13=P1^3; sbit P14=P1^4; uchar c,i,a=60,z; uchar code Numcode ={0XC0,//;0 0XF9,//;1 0XA4,//;2 0XB0,//;3 0X99,//;4 0X92,//;5 0X82,//;6 0XF8,//;7 0X80,//;8 0X90,//;9 }; void delay(z) { while(z--); }
[单片机]
带USB和智能读卡器接口的C51微控制器
摘要:ATMEL公司是51单片机生产厂家之一,该公司新推出的AT8xC5122系列微处理器可支持USB和读卡器,并且具有两种封装形式,可以方便地应用于多种场合和仪器中。 关键词:单片机;USB;读卡器;微控制器;AT8xC5122 1 AT8xC5122的特性结构 Atmel公司最近又生产了一系列带USB和智能读卡器接口的微处理器(如AT83C5122、AT85C5122、AT89C5122等)。这些器件是由8位微处理器80C51优化派生出来的高性能CMOS微处理器,带有USB和智能读卡器接口,其中AT8xC5122保留了Atmel 80C51的特性,带有32kB的ROM、768字节的内部RAM、一个四级中断系统、两个16
[单片机]
直流电机调速C51程序
直流电机调速C51程序 #include reg52.h unsigned char code f_rotation ={0x02,0x04,0x08,0x10};//正转表格 unsigned char code b_rotation ={0x10,0x08,0x040,0x02};//反转表格 void delay(unsigned int i)//延时 { while(--i); } main() { unsigned char i; while(1) { for(i=0;i 4;i++) //4相 { p1=f_rotation ; //输出对应的相 可以自行换成反转表格 delay(10
[单片机]
C51串口通信(中断模式)T2产生波特率
#include reg52.h #define uchar unsigned char uchar temp; void serial()interrupt 4 using 1 { if(RI) { RI=0; temp=SBUF; SBUF=temp; } else if(TI) TI=0; } main() { uchar string = AT89C52 Microcomputer!Designer: Grarry Meng ; uchar i=0; RCLK=1; TCLK=1; TH2=0XFF; TL2=0XDC; RCAP2H=0XFF; RCAP2L=0XDC;
[单片机]
[C51代码]数码管段码
接法为:Px.0~Px.7-a~h unsigned char co de distab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管段选码表,无小数点 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} unsigned char co de distab ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87, //共阴数码管段选码表,有小数点 0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1} unsigned c
[单片机]
单片机C51实用通信协议
一、基本格式: 通信头- 巴克码- 地址字- 长度字- 命令字- 信息位- 校准字 1. 通信头:占1~8个字节,表通信开始(0x00、0xff不能用作通信头); 2.巴克码:占1字节,一般为0x72,表通信头结束; 3.地址字:表终端的地址,占1字节(0x00作为广播地址); 4.长度字:占1字节,表示从地址字到信息位之间的字节数; 5.命令字:占1字节,指示终端的不同操作; 6.信息位:不定长,从0~252字节; 7.校验位:两个字节,采用和校验及CRC校验。 二、应答 1.如果终端接收正确,则应答ACK;如果终端接收错误,则应答NAK; 2.发送方收到ACK,此次通信结束; 3.
[单片机]
C51语言编程:单片机与 PC 串口通信程序
单片机接收PC机发来的指令信号,然后单片机又向PC机发送字符串。具体要求如下: 当接收指令信号为:'go',单片机向PC机发送字符串:WELCOME TO CHINA!; 当接收指令信号为:'who',单片机向PC机发送字符串:MY NAME IS LIMING; 当接收指令信号为:'home',单片机向PC机发送字符串: YINGYONGKEXUEXUEYUAN。 PC机上的串口调试软件,会在窗口显示出单片机送回来相应字符串; 如果接送的字符串不正确,单片机不响应。 采用C语言。 题目链接:http://zhidao.baidu.com/quest
[单片机]
C51单片机中断函数的修饰方法
interruptm修饰符 C51中断函数必须通过该修饰符进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51系统中断的处理方式自动把它安排在程序存储器中的相应位置。 在该修饰符中,m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。 C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。 【例】编写一个用于统计外中
[单片机]
<font color='red'>C51</font>单片机中断函数的修饰方法
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved