1.void指针
一般来说,只能用指向相同类型的指针给另一个指针赋值,而在不同类型的指针之间进行赋值是错误的。比如:
int a,b;
int *p1 = &a,*p2 = p1;//正确
而,
int a;
int *p1 = &a;
double *p2 = p1;//错误
即,上述语句中的两个指针p1、p2指向的类型不同,除非进行强制类型转换,否则它们之间不能进行相互赋值。
void指针是一个特例。c++允许使用空类型(void)指针,即不指定指针指向一个固定的类型,其定义格式如下。
void *p;
它表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。void指针可以指向任何类型的c++数据。即,可以用任何类型的指针直接给void指针赋值。不过,如果需要将void指针的值赋给其他类型的指针,则需要进行强制类型转换。比如:
int a;
int *p1 = &a;
void *p2=p1;//int 类型指针赋给void类型
int *p4 = (int *)p2;//强制类型转换
void指针与空指针不是一回事。
空指针:不指向任何对象的指针
2.const指针
如果在指针定义前加上关键字const,就包含一些特殊含义,而关键字const的放置位置不同表示的意义也不同,主要包括以下几点。
(1)关键字const放在指针类型前,就是声明一个指向常量的指针。此时,在程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。
(2)关键字const放在“*”和指针名之间,就是声明一个指针常量(也称常指针)。因此,指针本身的值不可以改变,也即它不能在指向其他数据,但它所指向的数据的值可以改变。
(3)在指针类型前、“*”和指针名之间都加关键字const,则是声明一个指向常量的指针常量,指针本事的值不可以改变,它所指向的数据的值也不可能通过指针改变。
(引用自 C++编程兵书/亓永刚编著)