学习内容第五章指针1.理解指针和指针变量2.理解指针与数组3.指针与函数4.C51语言中的指针应用指针作用正确的使用指针类型数据,可以有效地表示复杂的数据结构,直接处理内存地址,可以更有效合理的使用数组。一、指针和指针变量voidmain(){floatx=3.14;inty=25;…}变量的两个物理意义:(1)变量的地址(2)变量的内容200020012002200320042005…xy变量的内容变量的地址3.1425变量的地址:指编译器为变量所分配的存储区域的首地址。变量的内容:指变量所对应的存储区域的内容,即变量的值。voidmain(){inta,b,c;a=5;b=3;c=a+b;…}303132333435abc5直接将整数5存入变量a3直接将整数3存入变量b8直接将变量a、b的值取出,相加后存入变量c利用变量名存取数据的方式称为“直接访问”方式。1、利用变量名对存储单元进行访问一、指针和指针变量一、指针与地址的关系单片机程序中的常量和变量都要存放在以字节为单位的内存单元中。单片机是按照地址来访问该单元的内容的。如果将欲访问单元的地址存放在另一个单元中,访问时先找到存放地址的单元,才能找到需要访问的单元,这种“间接访问”方式需要用到指针。指针数据类型:是专门用来存放其他数据类型地址的。p200020012002200320042005200620072008abc532004a和b相加的结果(*p=a+b)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。p2004cp=&c8voidmain(){inta=5,b=3,c,*p;p=&c;*p=a+b;…}●变量的地址称为变量的指针●存放地址的变量称为指针变量2、利用指针对存储单元进行访问—间接访问方式一、指针和指针变量voidmain(){inta,*p=&a;floatx,*q=&x;…}2000200120022003200420052006200720082009apxq20042000voidmain(){inta,*p;floatx,*q;p=&a;q=&x;…}指针变量定义的形式指针变量初始化类型标识符*指针变量名;&--取地址运算符一、指针和指针变量voidmain(){inta,*p=&a;floatx,*q=&x;*p=5;printf(a+3=%d\n,*p+3);…}1、间接存取运算2000200120022003200420052006200720082009apxq20042000*p=&a;×voidmain(){inta,*p1,*p2;floatx,*q;p1=&a;q=&x;p2=p1;…}2、赋值运算5*--取内容运算符(间接访问运算符)一、指针和指针变量例:有个整型变量n存放在内存单元60H中,则该内存单元地址60H,就是变量n的指针。指针变量概念:如果一个变量专门用来存放另一个变量的地址,则该变量称为指针变量。二、指针变量的定义指针变量必须先定义后使用。定义的一般形式为:数据类型[存储器类型]*指针变量名;数据类型为指针变量所指向的变量的类型。指针变量名为定义的指针变量的名字。存储器类型为可选项,默认为三个字节,idata、data、pdata为一个字节,code为两个字节。例:int*pt;定义一个指向对象类型为int的一般指针,指针长度为3个字节。chardata*pa;定义一个指向对象类型为char的基于data的指针,指针长度为1个字节。注意:变量的指针:即变量的地址。指针变量:一个变量里面存放另一个变量的地址。每一个变量都有它自己的指针(地址)。每一个指针变量都是指向另一个变量的地址。“*”表示指向。三、指针变量的引用指针变量中只能存放地址。在C51中,变量的地址和指针变量的地址都是不可见的。“&”取地址运算符。例:intt;int*pt;pt=&t;使用“&”和“=”就可以使一个指针变量指向一个变量。完成变量、指针变量的定义及指针变量的引用后,就可以对内存单元进行间接访问了。例:将整形变量t的值赋给变量x.x=t;直接访问int*pt;pt=&t;x=*pt;例四、数组指针数组及其元素同样占有存储单元,都有相应的地址,指针也可以指向数组。指向数组的指针是数组的首地址。指向数组元素的指针则是数组元素的地址。例:定义一个数组x[8]和一个指向数组的指针变量px.Intx[8];Int*px;;此时数组和指针变量没有关系。若px=&x[0];则指针变量即指向数组x[]。C语言规定,数组名代表数组的首地址,即第一个数组元素的地址。五、指针变量的运算Intx[8];Int*px;px=&x[0];1、px++;将指针变量px指向下一个数组元算x[1];2、*px++;等价于*(px++)。3、*++px;等价于*(++px);先使px加1,再取出*px的值。4、(*px)++;表示所指向的元算值加1。5、特别注意:px+1.C规定:px+1指向数组首地址的下一个元素;而不是将指针变量px的值简单地加1.指针应用举例指针应用举例例1:将片内RAM30H单元开始的15B数据传送到片外RAM3000H开始的单元中去。汇编语言程序如下:ORG0000HLJMPMAINORG0100HMAIN:MOVR0,#30HMOVDPTR,#3000HMOVR7,#15LOOP:MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR7,LOOPSJMP$ENDC51语言程序如下:voidmain(){charidata*pi=0x30;charxdata*px=0x3000;unsignedchari;for(i=0;i15;i++){*px++=*pi++;}//等价于*(px++)=*(pi++);}while(1);}指针应用举例例2:片内RAM30H开始的单元中有10B二进制数据,编程求它们之和(和256),并将和存于内部RAM40H单元中。汇编语言程序如下:ORG0000HLJMPMAINORG0100HMAIN:MOVR0,#30HMOVR7,#10CLRALOOP:ADDA,@R0INCR0DJNZR7,LOOPMOV40H,ASJMP$ENDC51语言程序如下:voidmain(){charidata*pi=0x30;unsignedchari;charsum=0;for(i=0;i10;i++){sum+=*pi++;}pi=0x40;*pi=sum;while(1);}