设计与开发

单片机的程序指针 九,c语言学习难点之指针

小编 2024-10-21 设计与开发 23 0

九、c语言学习难点之指针

指针和数组应该算是C语言的精华及难点,很多初学者都是被这一章节难倒的,包括作者在内,也不敢说在指针上就真的全懂了。只能在此抛砖引玉,希望讲讲基础知识,有大神看到了能够扩展高级应用。

在介绍数组和指针之前,大家可以先思考三个问题,这三个问题也是我在读书得时候学习C语言得时候老师提的,学习的时候可以带着问题去学。

第一个问题,什么是指针;

第二个问题,什么是数组;

第三个问题数组和指针之间有关系吗?

如果能准确回答出这三个问题的孩童,这篇文章不用看了,基本的指针和数据你都会了,你可以找更深入的相关资料研究。

什么是指针?

指针定义:int *p

这是大家经常看到的定义方式,就是定义一个指针P,那么好了,接下来就有两个问题需要解决了,指针定义好后,哪个是指针指向的地址,如何读取指针指向的地址内的存储值?

我们假设int*p定义在8bit-C51单片机的应用环境下,我们都知道8bit单片机总线是16bit,所以int*p指针指向的地址也是16bit的,所以这个指针笼统的意思就是在单片机的存储空间找一个2byte的存储位置(这里注意,如果是单片机专业的学生,按上述定义的指针的话,其实这个指针可以定义为ROM/RAM/XRAM的任何一个,所以应用中定义最好明确定义位置,怎么定义后续单片机知识再介绍),用来存储指针数据,这2byte位置的起始地址就是指针指向的地址。

我们作个类比来理解指针,如果我们把指针指向的存储空间看作酒店的某个房间,那*看着像不像一把锁的钥匙孔,很像吧, *是锁孔的话,那P是什么就不言而喻了,那是门,也就是进入房间里的门,你看酒店的门是不是都有编号呢,同样的我们存储空间也是有编号的,这个编号就是存储空间的地址,这样说来大家是不是就比较清晰的了解了指针的意思了呢?

所以,回归int*p定义,我们把P叫做指针变量,其里面存储的是存储空间的地址,千万注意不要把P当作存储空间的值。在8位单片机中int*p的P是16bit大小。*p才代表整个房子里的东西,也就是代表存储空间的数据,int就是定义这个房子多大,也就是*p能读取出来的数据长度。

举个简单的例子,定义一个指针,指向单片机xram空间地址0x1000如下图

定义int*p = (int*)0x1000;

那么:P = 0x1000;*P = 0X1122;

留个问题,定义unsigned char *p = (unsigned char *)0x1001,那么P是多少,*p又是多少值呢?

注意:指针变量P的占位大小(占多少位空间),只跟单片机的总线宽度有关(如果是计算机的话,可能跟计算机的位数有关,不专业,不作介绍),相关知识如果有机会后续单片机再介绍。

本章节适合初学者了解指针的基本定义,至于更深入的,比如指向指针的指针,指向函数的指针等等,后续有机会再跟大家进一步讨论。下一章节将介绍一下数组的概念。有兴趣的可以点赞关注。

C51 单片机 16-5 指针的初步认识1

这次我们还是用两个单片机来通信,

这次要求是主机发送0x30,

从机收到后点亮P2.0小灯,然后回发一个数组,

主机收到数组后先判断数组发来的是不是正确的。

正确点亮P2.7小灯,错误点亮P2.4小灯。

主机程序。

#include<reg52.h>

unsigned char shuzu[10];//定义一个可以接收10个字节的数组

unsigned char *zhishu; //定义一个指针变量zhishu

bit panduan=0;

unsigned char i;

unsigned char jishu=0;

void main()

{

EA=1;

SCON=0x50;

TMOD=0x20;

TH1=256-(11059200/12/32/9600)

TL1=TH1;

ES=1;

TR1=1;

SBUF=0x30;

zhishu=&shuzu[0];

while(1)

{

if(jishu>=5) //jishu的值够5个就去对比

{ jishu=0;

for(i=0;i<5;i++)

{ if( *(zhishu+i)==(1+i) )

panduan=1; 对比的全对就让判断=1;

else

{panduan=0; 有错误就让判断=0,然后跳出for循环,

i=5;}

}

if(panduan)

P2=0x7F;

else

P2=0xef;

}

}

}

void UARTzhongduan() interrupt 4

{

if(RI)

{ RI=0;

*zhishu=SBUF;

*(zhishu++);

jishu++;

}

if(TI)

{ TI=0; }

}

从机程序

#include<reg52.h>

bit kaishi=0;

unsigned char shuzu[]= { 1,2,3,4,5,6};

unsigned char *zhishu; //定义一个指针变量zhishu

unsigned char jishu=0;

void main()

{

EA=1;

SCON=0x50;

TMOD=0x20;

TH1=256-(11059200/12/32/9600)

TL1=TH1;

ES=1;

TR1=1;

zhishu=&shuzu[0];

jishu=sizeof(shuzu);

while(1)

{

if(kaishi)

{

kaishi=0;

TI=1;

}

}

}

void UARTzhongduan() interrupt 4

{

static unsigned char i;

if(RI)

{ RI=0;

i=SBUF;

if(i==0x30)

{ kaishi=1;

P2=0xfe;//让2.0的小灯亮

}

}

if(TI)

{ TI=0;

kaishi=0;

while(shuzu--)

{ SBUF=*zhishu;

*(zhishu++); }

}

}

相关问答

at89c52 单片机的 内部系统 指针 有哪些?

AT89C51/52单片机内部指针有3个,一个是16位程序地址指针PC,用来寻址内部程序存储器,也就是用来执行用户程序;第二个是16位数据指针DPTR,本质上它是地址指针...

什么是堆栈,51 单片机 堆栈 指针 SP的使用?

在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。...

8031 单片机 复位时 程序指针 PC的值是多少?

都是指针。PC:0000H。用于取指。SP:07H。用于保存数据。都是指针。PC:0000H。用于取指。SP:07H。用于保存数据。

请叙述 程序 计数器pc的作用. 单片机 复位后pc的值为多少?

程序计数器(PC)指向当前指令,比如你的代码有10条指令,现在正在运行第三条指令,那么PC就是3,如果是没有跳转的话PC加一就可以获取到下一条指令。所以单片机...

单片机程序 烧写,使用原理?

PC机写好的程序,通过编译器转换成二进制文件,然后通过烧录器写入到单片机的程序寄存器中(ROM,相当于电脑的硬盘;烧录器和单片机之间的通信,是通过特定的协...

怎样熟练掌握C语言的 指针 ?

C语言指针就是这门语言的灵魂,说难学,那肯定是有难度的,毕竟这是业界公认的。但是如果你熟练掌握了指针的话,它又将会成为你手中的一柄利器。下面就详细的分...

单片机 复位后pc值为多少?

单片机复位分为硬件复位和软件复位,硬件复位时,PC值为0000H,也就是程序存储器ROM的起始地址。软件复位的目的一般是在线编程,复位时,PC将指向单片机的ISP区...

单片机 当中的 程序 状态字PSW,是做什么的?能给具体的说说吗?谢...

程序状态字(PSW)是单片机中的一个寄存器,用于存放当前程序的执行状态。它包含了许多寄存器,如工作寄存器、标志位、堆栈指针等。在单片机的运行过程中,这些寄...

单片机 执行完 程序 后会怎么样?

END根本就一条伪指令,在51汇编中只是作为表示我要写程序到此就结束而已了,PC指针根本不会跑到END去执行的,你在写程序时觉得单片机的要执行的指令完了以后(也...

关于c51 指针的 用法的疑问?

这种赋地址方法在C51中比较常用,强行让xdp指向外部RAM,地址为0x1000。*p=max没问题,因为是指针,在这里相当于把max的值放到p的地址中。p定义为xdata,赋值为...

猜你喜欢