您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 学习笔记与思考_7 void和void*指针的用法

2015-08-18 10:21 435 查看
(一)void的含义

void的字面意思是“无类型”,void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:

void a;

这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。

void真正发挥的作用在于:

(1) 对函数返回的限定;

(2) 对函数参数的限定。

int f(void); equal to   int f();
void f();


(二)void*指针

C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址,void*表明该指针与一地址值相关,但是不清楚在此地址上的对象的类型。Void*指针只支持几种有限的操作:

1.与另一个指针进行比较

2.向函数传递void*指针或从函数中返回void*指针

3.给另一个void*指针赋值

4.不允许使用void*指针操纵它指向的对象

由于其他指针都包含有地址信息,所以将其他指针的值赋给空类型指针是合法的;反之,将空类型指针赋给其他指针则不被允许,除非进行显式转换。

因此,void*的作用大致如下:

1. 传参:通用类型

可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。

在WinSocket编程中,_beginthread()函数的参数就是使用void*的一个实例。

2.强制类型转换

有时候由于重载等的干扰,导致需要转换成void *,来进行取地址。

例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。

3.指向0的地址

(void *)0,指向全是0的地址,相当于NULL。

非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	
	double obj=3.14;
	int a=7;
	double *pd=&obj;
	void *pv=&obj;  //ok 
	pv=&a;  //ok 
    (*pv)++; // error,不得操纵对象
	int *ptr=&a;
	void *p=ptr; //ok
	ptr=p;  //error,不能将空类型指针赋给其他指针 
	ptr=(int*)p; //ok,显式转换 
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: