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的一个指针;
- #include <iostream.h>
- int *exforsys;
- void main()
- {
- *exforsys=100;
- }
这里会运行出错,是很经典的一个错误,exforsys根本没有申请内存,怎么为他赋值呢?所以就有了
exforsys=new int();
我可以int *exforsys=NULL;于是我定义了一个指向0的整形指针;Void指针是一个可以指向任何数据类型的特殊指针。NULL指针不指向任何有效的地址空间或者引用,但是却可以被任何类型指针指向。