char a[3]={1,2,3};
void main()
{
b=&a;
unsigned char i,vaule;
for(i=0;i<n;i++,b++) {
vaule=b;}
就可以循环取出数组的值并赋值给 vaule了 或者 直接取a[2]的话就 (b+2)就得了,为什么弄得那么复杂。指针+1就是表示取地址后面那个数了,自加就可以不断取后面的数PC——程序计数器,功能:用来指示下一条指令的地址(逻辑地址即偏移量),一般情况下,系统指示对其进行加1 *** 作,担当遇到转移指令,如JMP,CALL,LOOP等时系统就会将跳转到的指令地址保存在PC中DPTR是个16位的寄存器,主要用来寻址,他存储的是空间地址。因此可寻址存储64k的范围。
SP堆栈指针,主要用来调用子程序或者进入中断的时候保存当前的寄存器内的数据,和当前程序计数器值。在程序返回后把内容d出。回到断开的程序段处继续执行。首先,你要明白一个概念,指针,是做什么的?答案是,指针,是指向地址的。
程序指针,指向的空间,在物理上是Flash,在逻辑上,就是代码空间。比如说51单片机的PC指针,指向的就是Flash,即程序下一步要执行的指令的地址。
数据指针,指向的空间,在物理上有Flash和RAM,在逻辑上是Flash里的常数空间和数据空间,注意,是对于单片机来说,对于我们的电脑,常数空间不是在Flash上。
比如说51单片机的DPTR,如果用MOVC A,@A+DPTR,此时,就是指向常数空间,如果用
MOVX A,@A+DPTR就是指向的数据空间。
堆栈指针,指向的空间,在物理上是RAM,在逻辑上,就是数据空间,是特定的数据空间,堆栈是数据空间中单独划分出来,专门用于寄存中间结果的内存空间。
数据指针和堆栈指针主要有两个区别:
一是数据指针可以指向Flash,即可以指向常数,比如说我们定义一个数组 unsigned char code Table[99],此时,就是DPTR可以指向常数空间。堆栈指针是不可以的,只能是指向RAM。
第二个区别,堆栈指针指向的是特定的数据空间,这个特定的数据空间,是从整个数据空间里划分出来,专门用于作堆栈用的,堆栈区间一旦划分出来,堆栈指针在规则上,就只能在这个范围内活动,如果出了这个范围,可能导致整个程序的崩溃。而数据指针在规则上,可以指向整个数据空间,但是,可以读堆栈空间,不应该去修改,否则也可能导致程序的崩溃。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)