写在前面
如果对Java而言,万物皆是对象。那么对C/C++而言,万物皆是内存里的一段段二进制buffer,以指针为头,以\0为尾。C/C+开发者更追寻计算机的本质,是徘徊在漫天010101世界里孤独而睿智的流浪者。
——秋名山码农
指针是C语言中最具精髓的类型,它直接赋予了开发者操作底层硬件的能力。在大规模数据处理和算法实现领域,相比其他高级语言有着显著的性能优势。但指针的不规范运用,常常造成了野指针、空指针、内存泄漏等问题,这也是入门者最大的拦路虎。
什么是指针?
我们知道,计算机中程序执行的动态数据都是存储在内存之中,系统在加载程序之后,会在内存中开辟一段内存空间提供程序使用。但这一大“坨”空间分别代表什么数据呢?
很显然,这一大“坨”空间需要分段进行标记,而这个标记就是指针。在物理上,指针通常表示为一个4Byte(32位系统)或8Byte(64位系统)的无符号整数。这个指针(内存地址),就代表了指针所指向变量的内存地址开头。
以快递柜为例,大家拿到取件码,就可以去快递柜拿到我们的包裹。而这个例子里,取件码就类似一个指针,整个快递柜就相当于系统为程序开辟的内存,快递柜里的包裹就是程序操作的数据。用户拿到取件码(指针),就能去快递柜(内存)拿到快递小哥存放在这里的包裹(数据)。
指针类型又是什么意思?
指针类型就是这个指针所指向的数据类型。
我还是想以快递柜举例。首先,C语言中有短整型(short)、整型(int)和双精度浮点型(double)。对应空间占用如下:
short ——>2Byte——>小方格
int ——>4Byte——>中方格
double——>8Byte——>大方格
他们依次对应的就类似快递柜里的小、中、大三种方格。类似地讲,
小方格取件码(short指针)能取出里面的小包裹(short数据)
中方格取件码(int指针)能取出里面的大包裹(int数据)
大方格取件码(double指针)能取出里面的大包裹(double数据)
实际上,指针类型规定了该指针指向内存的大小(方格大小)以及数据类型(包裹大小)。在物理上讲,指针的地址值,限定了目标数据的开头,指针的类型,也就限定了目标数据的结尾,以及告诉编译器以什么类型呈现该数据。
So,什么是空指针、野指针
我们将视线再次转到楼下的快递柜。
首先,对一个特定程序而言,它能访问的程序空间是有限的,系统限定了程序在规定的内存范围内读取和写入。
同理,不是什么取件码都能从快递柜里取出包裹。
空指针(全0取件码)不是一个有效的内存地址或者是被系统保留的,当程序尝试访问空指针时,系统会抛出一个异常(快递柜显示取件码无效)。这也就是为什么在编写C程序时,要常常做指针判空。
野指针(假的或者已经用过的取件码)和空指针类似,也是系统不允许程序访问的。野指针常常出现在对free掉的指针(用过的取件码)的访问。
打个比方,小明今天用03548792从快递里取出了(free)种草半年的雷姆手办,很显然03548792不能从快递柜里再取出一只雷姆,取而代之的是“取件码无效”(野指针访问异常)
欢迎搜索:秋名山码农 不定期更新Java、C/C++编程之道
欢迎后台私信留言交流~(未经授权禁止转载)
本文暂时没有评论,来添加一个吧(●'◡'●)