http://book.51cto.com/art/200909/154154.htm
7.9 特殊指针
除了有明确指向和类型的指针外,有时候还常常用到一些特殊类型的指针,以应对特殊的用途。本节将向读者介绍void型指针和空指针,这两种指针在实际应用中经常会用到。
7.9.1 void型指针
void型指针就是无类型指针。它没有类型,只是指向一块申请好的内存单元。其格式如下所示。
- void *p;
其中,void表示"无类型",表示不明确指针所指向的内存单元应该按什么格式来处理。p是指针变量名。整体的意思是指定义了一个指针p,但却不规定应该按何种格式来解释其作指向的内存单元的内容。由于void只是说明被修饰的对象无类型,却不分配内存,所以除指针外不能定义其他类型变量。因为指针本身的存储空间是定义时就申请好的,其指向的内存单元可以在需要的时候再申请。但是其他类型,如int、float等,则必须定义即申请,否则没有内存单元来存放数据。
【示例7-23】 演示void型指针的定义。
- void *p;
- void x;
分析:示例中,第1条语句是允许的,但第2条是不允许的。实际上,void几乎只是在"说明"被定义变量的类型,不涉及内存的分配。
在7.4.4节中,malloc()函数的声明格式中,返回值为void型。这表明malloc只是按照要求的大小分配了内存单元,不负责解释这些内存单元的格式。因此,在使用malloc时,一定要用强制类型转换,转换为需要的类型。否则,使用时会发生错误。
在本书的例子中,常常会看到main()函数的参数被写为void,这表示不关心,也不像处理命令行参数。在main()函数的定义中,这是允许的。
除了void型指针外,还经常用在两种情况下,这两种情况都与函数有关。
如果函数没有返回值,那么应该声明为void型。C++不再允许默认为int型返回值,要求没有返回值时必须用void说明。
如果函数没有参数,应该用void说明。C++也允许不用void说明,这时该函数相当于某些其他语言中的过程。
【示例7-24】 演示void型指针的使用。
分析:该示例定义了3个指针,其中一个是void型。首先给void型指针申请了4字节的内存单元,然后分别强制转换为char型和int型。从这个示例可以看出,可以用void型指针预申请一块内存单元,当需要的时候再告诉系统怎么来解释这片空间。
- int main(void)
- {
- void *pVoid=0; //void型指针
- char *pChar=0;
- int *pInt=0;
- pVoid=malloc(4); //申请内存单元
- pChar=(char*)pVoid; //强制转换为char*
- for (int i=0;i<3;i++)
- *(pChar++)='a'; //循环赋值
- *pChar='/0'; //赋字符串的结束符
- cout<<pChar<<endl;
- pInt=(int*)pVoid; //强制转换为int*
- *pInt=1234;
- cout<<*pInt<<endl;
- free (pVoid); //释放
- pVoid=0; //置空
- return 0;
- }