指针的初始化

1、指针的含义    

在我前面的文章《指针一》中我说明了,我们使用指针的直接目的就是将一个地址存放在指针变量中,然后通过访问指针中存放的地址来间接的访问数据;所以指针一定要存放某个地址,即指针一定要指向某段存储空间,当然你可能会说指针指向存储空间不大正确,指针指向的其实是存储空间当中的数据等等;但是,我要说,根据指针的用法,与其说指针是指向某个数据,不如说指针是指向某段存储空间,更确切的说是指针指向某段存储空间的起始地址;所以一个有效的指针变量必定指向某段存储空间,或者说是指针变量中必定存放某段存储空间的首地址,至于存储空间里是否存在数据,这并不重要,因为我们用的就是指针指向的这段存储空间,或者说是存储空间的首地址;所以,在这里我再说一句:

在使用某个指针变量之前,应该知道该指针到底指向了哪段存储空间,或者说是该指针存放了哪段存储空间的首地址,如果没有,则不可用,需要将该指针指向某段存储空间的首地址(先不考虑NULL指针)


至于我说指针指向某段存储空间,是因为一个指针必定有类型限制的;现在先不谈void型的指针,只谈实际应用的,即使你使用void型指针,也必定得强制转化成其他类型,因为void型指针根本就不是指针类型;好了,回来接着说,指针指向的存储空间的大小是由该指针的类型决定的,从这一点就可以知道void类型的指针不是真正的指针类型,因为你没办法确定void型指针的存储空间的大小。


如果不考虑NULL指针的话,一句话说明指针的初始化:

使指针存放某段存储空间的首地址。

只有指针指向了某个有效空间的首地址,该指针才能使用,否则使用没有初始化的指针,或者说使用没有指向某个存储空间的指针,可能造成系统崩溃,因为如果你没有对指针进行初始化,那么该指针指向的空间有可能是无效的或者非法的。


2、NULL指针和0指针

// Define   NULL   pointer   value 
#ifndef   NULL 
#   ifdef   __cplusplus 
#     define   NULL      0 
#   else 
#     define   NULL      ((void   *)0) 
#   endif 
#endif //   NULL 

上边就是C++标准库中关于NULL的定义,可见NULL是一个宏,在C++里面直接被定义成了整数立即数类型的0,在没有_cplusplus定义的前提下,就被直接定义成指向0地址的void*类型的指针常量;


在指针实际的初始化中,当你需要这个指针但暂时又没办法对这个指针进行有效的初始化的时候,你就可以先使定义的指针悬空,即指向NULL;因为有可能你根本就不知道在哪里会用到,或者是只有当某个指针变量进行一些操作后,才可能会用到中间指针变量,这时候你最初定义的NULL指针就派上用场了。


所谓的NULL指针其实是对指针的一种保护手段,避免指针指向非法区域,但是让指针变量指向NULL,实际上并没有进行有效的初始化,注意,我说的是有效的初始化,如果你想用NULL指针,你还需要对NULL指针进行赋值,把它强制转化成你想要的指针,也就是使NULL指针指向你想用的存储空间。

你也许会有疑问,那NULL指针到底指向哪些存储空间呢,好,现在我们就看一下NULL指针到底指向哪段存储空间:

        (1)我们在程序中所用的地址都是经过MMU进行偏移计算后的虚拟地址,不再是实际的物理地址,所以我们所说的NULL指针即使在程序中最终显示为指向0x0地址,也并不意味着该NULL指针指向0地址,虚拟地址和物理地址是两个概念;而且,不同程序的NULL指针也不同,这是因为系统在运行程序时,会分配一个确定大小的内存段用于映射这个程序的所有内容(即物理地址上的内容),并且会为这个内存段进行虚拟地址和物理地址的换算;所以,即使不同程序中的NULL指针指向同一地址0x0地址,其实该0x0并不是内存的起始地址,而是该程序运行空间的开端。

(2)现在知道NULL指针指向0x0地址到底是怎么回事了,现在来看NULL指针指向的存储空间有多大;上面说了,系统会为程序分配一段运行的内存空间,NULL指针就是指向这段内存空间的开端,那么为了保证NULL概念,系统对这段内存空间的最初的64K空间做了访问限制,即这段起始的64K内存空间既不能访问也不能使用,仅作保留,这段内存的地址就是0x00000000到0x0000FFFF;而且起始的64K空间在物理地址上没有映射,所以你的程序一旦对这段内存空间进行操作时,那系统是找不到实际的物理空间的,因此系统就会报错;

我猜想这个64K的空间是不是为了满足各种复杂的结构体类型的指针而设计的,对于一般的应用而言,64K的空间满足需要了。

(3)如果你定义一个指针变量,没有对其进行有效的初始化也没有将其指向NULL,那么有这时指针指向的空间是随机的,这就是所谓的野指针,所以一旦此时指针指向运行空间的最初的64K空间,或者是程序能操作的存储空间,那么系统就会报错;说白了,将指针指向NULL,就是告诉系统,我这个指针不能有任何操作,如果你想操作,那好,让它指向有效空间吧。


所以指针运用错误一般是三类:

一类是使用了野指针,超出了作用范围;

一类是对NULL指针进行操作;

一类是指针指向的地址非法区域。


所以在使用指针前,一方面要判断这个指针是不是进行了初始化,另一方面要判断这个指针是否指向NULL


3、指针的初始化

我认为对于指针的初始化有两种:

(1)指向能够操作的存储空间

(2)指向NULL或者0

所谓指向能够直接操作的存储空间就是指定类指针指向的存储空间的首地址和大小,可以对存储空间进行操作;指向NULL就是一种权宜之计,暂时使指针有个落脚点,但是这个落脚点不是你的,你没有权力对这个落脚点进行操作,所以在使用之前,要给指向NULL的指针重新找一个你能进行操作的落脚点。


0对指针来说,很有趣,0是唯一一个能够直接对指针变量赋值的值,一旦给指针变量赋值为0,其实就是将这个指针变成指向NULL,我上面说NULL指针显示为地址0x0,其实不一定正确,对于不同系统来说,NULL值有可能不同,所以,0赋给指针,肯定使指针指向NULL,但是NULL指针不一定指向0x0。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值