遇到一个类型转换的问题,当我试图将void*类型的a转化为string型的b时,这样写:
1 1 void *a; 2 2 string b; 3 3 b = (string)(*a); //错误
出现如下错误:
error: ‘void*‘ is not a pointer-to-object type(void*不是指向对象的类型)
正确代码:
void *a; string b; b = *(string*)a;
将a先转化为string的指针然后解引用,赋值给b(对string指针的解引用获得的当然是string类型)。
揪根问底(C/C++):
void*表示“空类型指针”,表示:任意类型的指针,或者该指针与一地址值相关,但是不清楚在此地址上的对象的类型。
不能直接对void*类型解引用,因为不存在void类型的变量。
void关键字表示“空类型”,表示不存在的意思,而非表示任意类型,因此可以用void修饰函数( void a(void); 表示函数无返回值,或者返回值为空 return; ,在函数形参位置表示函数没有形参),但不能用void修饰变量,也就是不能写语句 void a; ,不存在类型为void的东西。
再进一步,为什么不能存在void类型的变量,或者说为什么在面对变量的时候,void就不能表示“任意类型”呢?
我们知道C/C++是静态类型的语言,定义变量就会分配内存,然而不同类型的变量所占内存不同,如果定义一个任意类型的变量,如何为其分配内存?
所以,C、C++中没有任意类型的变量。但是,所有指针类型的变量,无论是int*、char*、string*、Student*等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”,指针类型所占的内存与系统的寻址能力有关,例如32位系统占4字节,64位系统占8字节……
原文地址:https://www.cnblogs.com/qzwjer/p/11106401.html
时间: 2024-11-26 10:50:04