指针和数组应该算是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的占位大小(占多少位空间),只跟单片机的总线宽度有关(如果是计算机的话,可能跟计算机的位数有关,不专业,不作介绍),相关知识如果有机会后续单片机再介绍。
本章节适合初学者了解指针的基本定义,至于更深入的,比如指向指针的指针,指向函数的指针等等,后续有机会再跟大家进一步讨论。下一章节将介绍一下数组的概念。有兴趣的可以点赞关注。