关于void*类型的用法(相当于OC中的id类型)

时间:2022-03-22 03:07:26

关于void*类型的用法(相当于OC中的id类型)

1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*、float*甚至抽象数据类型的指针,而且可以从void* 强制转换为任何其他数据类型的指针,所以使用起来有时候会比较危险。如果开始将一个void*的指针间接引用一个float*的指针,然后将这个void*指针强制转化为一个int*类型的指针,编译器不会给出错误甚至警告,但是输出的数据却匪夷所思,如果再强制转换会float*则不会出现任何问题;

在后来发现,C++语言中(使用vs2005)任何数据类型的指针类型都可以互相强制转化(我想应该是因为不同指针都是地址,每种数据类型的引用都具备相同位数的缘故),如果强制转化为不同的数据类型之后再强制转换回来则不会又任何问题,如果强制转换为其他的数据类型进行运算,则数据不会是预料之中那样的;

void main(){

float f = 1.34f;
 float* pFloat = &f;
 void* pVoid = pFloat;
 
 int* pInt = (int*) pVoid; 
 *pInt = 1;
 float* fp = (float*)pVoid;

cout << pFloat << endl;
 cout << fp <<"  "<<  *fp << endl;
 cout << pInt << "  " << *pInt << endl;

}

最后输出的结果三个指针所指向的地址空间都是相同的,但是输出的数据却大不相同(我想应该是各种数据类型在存储时候数据格式不一样的缘故)。所以在写程序的时候尽量不适用void*类型进行数据操作。

2.但是在进行程序设计的时候,比如设计一个通用接口,在参数列表中有指针数据类型,但是在真正适用这个接口的时候并不知道每一次具体传入的会是哪种数据类型的指针,所以设计这个参数的时候就可以设计为void* 类型的参数,在使用的时候每次传进来一个需要的数据类型的指针,因为void*可以间接引用任何数据类型的指针;之后在函数实现的内部再将这个传入的指针由void*类型强制转换为本来所需要的数据类型的指针进行解析和使用即可,感觉在MFC的自动生成的接口中很多都采用了这种设计方式。