51单片机基础剖析(基于C语言)
放该指针存储器类型的编码,第二和第三个字节分别存放该指针的高位和低位地址的偏移量
存储器类型 | IDATA | XDATA | PDATA | DATA | CODE |
编码值 | 1 | 2 | 3 | 4 | 5 |
基于存储器指针:则该指针长度可为一个字节,也可为两字节
一个字节: (存储器类型 idata data pdata)
两个字节: (存储器类型为code xdata)
注:在定义指针变量时最好指定其为基于存储器的指针,这个生成的汇编代码长精 练一些,而且也节省空间(读者可自行到C51中写一个程序,查看其反汇编程序)但在一些函数调用的参数中指针需要采用一般指针,为此C51编译器允许这两种指针相互转换,转换规则如下:
一般指针转换成基于存储器指针,采取截断,基于存储器类型指针转换成一般指针采用扩展的。
(2).指针变量的引用
指针变量是含有一个数据对象地址的特殊变量,指针变量中只能存放地址与指针变量有关的两个运算符:
& 取地址运算符
* 间接访问运算符
&a为取变量a的地址,*P为指针变量P所指向的变量。如下:
int i , x, y;
int *pi,*px,*py;
pi=&i; //将变量i的地址赋给指针变量pi,也即pi指向i
px=&x;
py=&py;
*pi=0; //等价于i=0
*px+=6; //等价于 i+=6
(*py)++; //等价于 i++
注:指向同类数据的指针之间可以相互赋值。如pi=px;
(3).指针变量作为函数的参数
函数的参数不仅可以是整型,字符型等数据,还可以是指针类型,指针变量作为函数的参数的作用是将一个变量的地址传到另一个函数中去,地址传递是双向的,即主调用函数不仅可以向被调用函数传递参数,而且还可以从被调用函数返回其结果。下面通过一个简单的示例来进行说明。
#include
swap(int *pi,int *pj)
{
int temp;
temp=*pi;
*pi=*pj; //把指针变量pj所指向的变量的值送给pi所指向的变量
*pj=temp;
}
main( )
{
int a,b;
int *pa, *pb;
a=9;
b=7;
pa=&a;
pb=&b;
if(a
printf(“\n max=%d,min=%d \n”,a,b);
}
上程序上定义了一个swap( )函数,两个形参为指针变量,在调用函数时,所用的实参也是指针变量,在调用开始,实参变量将它的值传递给形参变量,采取的仍然是“值传递”方式,但这时传递的是指针的值(地址),传递后,形参pi的值为&a,pj的值为&b,即指针变量*pi 和*pa都指向了a, *pj和*pb指向了b。接着使*pj与*pi的值互换,从而达到了实现了a,和b值的互换。虽然函数返回时,pi pj被释放而不存在,但main函数中a 与b的值已经交换。
(4).数组的指针
在C语言中,指针与数组有着十分密切的关系,任何能够用数组实现的运算都可以通过指针来完成,例如定义一个具有十个元素的整形数据可以写成:
int a[10];
数组名a表示元素a[0]的地址,而*a 则表示a所代表地址中的内容,即a[0].
如果定义一个指向整形变量的指针pa并赋以数组a中的第一个元素a[0]的地址;
int *pa;
pa=&a[0]; //也可写成pa=a;
则可通过指针pa来操作数组a了,即可用*pa代表a[0];*(pa+i)代表a[i],也可以上pa[0];pa[1];pa[2]……pa[9]的形式
(5).字符数组的指针
用指针来描述一个字符数组是十分方便的,字符串是以字符数组的形式给出的,并且每个字符数组都是以转义字符‘\0’作为字符串的结束标志。因此在判断一个字符数组是否结束时,通常不采用计数的方法,而是以是否读到转义字符‘\0’来判别。利用这个特点,可以很方便的用指针处理字符数组。
示例如下:
#include
main()
{
char *s1;
char xdata *s2;
char code str[]={“how are you?”};
s1=str;
s2=0x1000;
while((*s2=*s1)!=’\0’)
{
s2++;
s1++;
}
s1=str;
s2=0x1000;
printf(“%s \n,%s\n”,s1,s2);
}
注:任何一个数组及其数组元素都可以用一个指针及其偏移值来表示,但要注意的是,指针是一个变量,因此像上例中的赋值 运算s1=str, s2=0x1000都是合法的。而数组名是一个常量,不能像变量那样进行运算,即数组的地址是不能改变的。如上面程序中的语句
char code str[]={“how are you?”};
是将字符串“how are you?”置到数组str中作为初值,而语句s1=str则是将数组str的首地址,即指向数组str的指针赋给指针变量s1,如果对数组进行如下的操作:
str=s1;
str++;
都是错误的。
(6).指针的地址计算
指针的地址的计算包括以下几个方面:
1 赋初值
指针变量的初值可以是NULL(零),也可以是变量,数组,结构及函数等的地址,例如
int a[10],b[10];
float fbuf[100];
char *cptr1=NULL;
char *cptr2=&ch;
int *iptrl=&a[5];
int *iptr2=&b;
float *flpt
51单片机C语 相关文章:
- Proteus运行Keil编写的51单片机C语言步骤(11-30)
- 《世上只有妈妈好》51单片机C语言程序(11-26)
- 51单片机C语言编程中对单片机绝对地址访问的两种方法(11-26)
- 硬件仿真器会不会被淘汰(11-26)
- 51单片机C语言头文件及其使用(11-26)
- 51单片机的C语言延时的一些总结(11-25)