关于空指针(指针指向为NULL)和void类型的指针的理解

           正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢


       经过自己的测试和查阅相关资料,得出如下总结:

       (1)空指针所对应的是指指向的对象为空的指针。

                   不经发问,什么叫指向为空呢?要理解这点,必须理解如下几点(有点啰嗦,但很细,别嫌我烦):

                  (a)任何指针都有类型(说穿了指针都是变量,只不过变量中的储存的是地址而已),这里也包括void  类型,其实它和常见的int,char一样只不过是一种储存类型。那试想一下,指针如果只是为了指向 一个地址的话,为毛还需要包含类型呢?我的理解是,指针之所以要加上类型,这样能够方便他和各种类的指向切换,怎么理解前面这句话呢?假设计算机是以字节编址的,也就是说,每个地址所 存储的为8个位,假设现在机器中int为32个位(也就是4个字节),这样的话,如果没有类型,单纯指针的进行p++(p为指针,没有类型,实际上就是void类型的指针),我们知道p所存储的是一个 地址,而地址实质上就是一个值,在计算机中,一个地址的值一般是以0x开头的16进制的数字保存。例如:0x cccccccc,如果p++,则p变成0x cccccccd,仅仅在数值上加了1,这样就无法实现各类型指针的自加自减运算。为了给指针运算的方便,所以给指针添加了类型,例如给指针限定为int型,由于int类型是4个字节,如果当前指针p的地址为0x 00000001,由于我们知道一个整型需要4个字节,每个字节占一个地址,对p进行类型限定后,会从p当前地址开始,连续找4个地址(按字节编址),对应4个储存体来存储一个整数类型,而p++所指向的将会是储存完当前一个int型的下个整型地址的起始地址。其实际值应该为0x 00000005。以上是我对指针为毛要有类型的理解

                   


                     (b)什么叫指向指针为空?指针指向的是内存中的一块储存体的地址,什么叫指针为空。当你定义完    一个指针的时候,指针指向哪里嘞。我在VS2010中做的测试是指针所存储的地址为0x cccccccc, 按照我的理解,这时候只是定义了一个指针啊,它什么也没指向啊,这个时候所指向的时候应该说它是空指针呢,从常理的角度来想,可以说它是“空”指针,因为它指向的是一块未知的内存区域。但实际上,这和公共定义上的空指针不同。c语言中定义,空指针,指针所指向内存中一块特殊的区域,即我们一般在编译中所使用的NULL中所存储的地址,在VS2010中,这个地址为0x00000000,这块不同的区域,根据编译器的不同,可能会有差异

         


                    (c)那什么是void类型?什么是void类型的指针呢?对于这个问题,我的理解也不是很深刻。(1)void 类型,当它作为函数的类型定义时,它表示函数没有返回值,或者说函数的返回值为空。(2)当  它用于指针声明时,表示的是指针的类型为空,其本质为一个储存单元的地址(具体编址规则不同计算机不同,所以只好说是储存单元)。从理解上来说,你可以理解为一个没有类型的指针(即一 个存储单元的地址)


以上是个人对空指针(NULL)与void类型指针的理解和区分,如果有不对的地方,希望各位与我交流和讨论

         

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值