关于void*和空指针

1.VOID*

void   *有时候又称为泛型指针,也就是可以指向任何类型的数据的指针,在大多数仅仅把一块内存看作raw   memeory,也就是没有任何类型信息的时候,就会把他定义为void   *,编译器对他的处理就是一个字节一个字节处理,类似于unsigned   char   *的处理方式,当然你的char类型必须是1个字节才行。   
在C的标准库中关于memory的操作<mem.h>几乎都是使用的void   *类型,将类型的转换交给程序员处理,否则相同的功能仅仅是因为数据类型不一样,就要提供一个函数,而偏偏C又不支持函数重载。

其实对C++和C来讲我们是不是可以这样想,C的malloc只是向系统申请了一块空白内存然后返回给你指向这块内存的指针,然后就什么都不做了;C++呢?记忆犹新的A*a=new A();其实C++做了三步,首先申请内存,其次在其上执行构造函数,最后把指针赋值给a;既然不是原子操作,就有可能产生问题,什么问题?cpu为了提高运行速度,对于代码第二步和第三步其实是可以交换的,试想有多线程代码判断一个类指针是否是null时,可能会出的情况;- -。。扯远了。

void(类型)指针,是一种特殊的指针,它足够灵巧的指向任何数据类型的地址空间。当然它也具有一定的局限:

在我们要取得指针所指地址空间的数据的时候使用的是 ‘*’操作符,程序员必须清楚了解到对于void指针不能使用这种方式来取得指针所指的内容。因为直接取内容是不允许的。而必须把void指针转换成其他任何valid数据类型的指针,比如char,int,float等类型的指针,之后才能使用'*'取出指针的内容。这就是所谓的类型转换的概念。

 

那void*可以理解成脚本语言中的万能varible变量?可以在需要的时候转换成任何数据类型。当然当转换的格式不对的时候,相应的内容也就不对了,甚至可能内存访问越界;

 

2.NULL

NULL指针是任何数据类型指针的一种。windows平台下说的很清楚

stdio.h

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

如果C++编译器就定义成0,否则定义成指向0的一个指针;

  1. #include <iostream.h>   
  2. int *exforsys;   
  3. void main()   
  4. {   
  5.   *exforsys=100;   
  6. }   

这里会运行出错,是很经典的一个错误,exforsys根本没有申请内存,怎么为他赋值呢?所以就有了

exforsys=new int();

我可以int *exforsys=NULL;于是我定义了一个指向0的整形指针;Void指针是一个可以指向任何数据类型的特殊指针。NULL指针不指向任何有效的地址空间或者引用,但是却可以被任何类型指针指向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值