1、在C++中,void表示为无类型,主要有三个用途:
(1)函数的返回值用void,表示函数没有返回值。
如:
void func(int a,int b)
{
//函数体代码
return;
}
(2)函数的参数填void,表示函数不需要参数(也可以不填void,直接空着不写)
int func(void)
{
//函数体代码
return 1;
}
(3) 函数的形参用void*,表示接受任意类型的指针
注意:
(a)不能用void声明变量,它不能代表一个真实的变量。
(b)不能对void*指针直接解引用,需要转换成其他类型的指针
比如,在下面这个函数中,直接对p解引用会报错,将p转化为其他类型的指针就可以了
void func3(string varname, void* p)
{
//cout << varname << "是" << *p << endl;//对void*类型的指针直接解引用会报错
cout << varname << "是" << *(char*)p << endl;//将void*转换为其他类型就可以了
}
(c)其他类型的指针赋值给void不需要转换
(d)把void*指针赋值给其他类型的指针需要转换
2、本节重点:
声明指针需要指定数据类型,是因为解引用的时候,必须知道数据占用的内存空间。但是用指针的目的不只是解引用,还有很多其他的用途,比如用cout输出字符型变量时,会显示“烫烫烫...”,此时可以加上void*进行转换
int a;
char b;
cout << "a的地址是:" << &a << endl;
cout << "b的地址是:" << &b << endl;
cout << "a的地址是:" <<(void*) &a << endl;
cout << "b的地址是:" << (void*)&b << endl;
也可以写一个函数来完成转换:(func1和func2对比)
void func1(string varname, int* p)
{
cout << varname << "的地址是" << p << endl;
}
void func2(string varname,void* p)
{
cout << varname << "的地址是" << p << endl;
}
调用函数
func1("a", &a);
func1("b", &b);//此行会报错,因为b的数据类型是char,&b就是char*类型,与func1函数定义的参数int*的类型不同
func2("a", &a);
func2("b", &b);
这种错误可以用一个强制转换就可以
func1("a", &a);
//func1("b", &b);//此行会报错,因为b的数据类型是char,&b就是char*类型,与func1函数定义的参数int*的类型不同
func1("b", (int*)&b);//此行会报错,因为b的数据类型是char,&b就是char*类型,与func1函数定义的参数int*的类型不同
func2("a", &a);
func2("b", &b);
不用强制转换的话, func2用void*的写法也没有问题
/*
func1("a", &a);
func1("b", &b);//此行会报错,因为b的数据类型是char,&b就是char*类型,与func1函数定义的参数int*的类型不同
*/
func2("a", &a);
func2("b", &b);