C和C ++中的void指针之间的区别

时间:2013-07-24 12:20:26

标签: c++

为什么C ++中出现以下错误(但在C中有效)

void*p;
char*s;
p=s;
s=p; //this is wrong ,should do s=(char*)p;

为什么我需要转换,因为p现在包含char指针的地址,s也是char指针?

3 个答案:

答案 0 :(得分:16)

这是有效的C,但不是C ++;它们是两种不同的语言,即使它们有许多共同的特征。

在C ++中,没有从void*到类型指针的隐式转换,因此您需要强制转换。您应该更喜欢C ++演员,因为它们限制允许哪些转换,因此有助于防止错误:

s = static_cast<char*>(p);

更好的是,您应该使用多态技术(例如抽象基类或模板)来避免首先使用无类型指针;但这超出了这个问题的范围。

答案 1 :(得分:8)

值无关紧要,类型确实如此。由于p是一个void指针而s是一个char指针,所以即使它们具有相同的值,也必须进行转换。在C中它可以,void*是通用指针,但在C ++中这是不正确的。

顺便说一下,p 不包含char指针,它是一个void指针,它包含一个内存地址。

答案 2 :(得分:0)

通常,此规则甚至与指针无关。只是你可以将某种类型的值分配给其他类型的变量,但反之亦然。类似的情况是这样的:

double d = 0.0;
int i = 0;

d = i;    // Totally OK
i = d;    // Warning!

所以这就是你必须要忍受的东西。

相关问题