为什么以下在 C++ 中是错误的(但在 C 中有效)
void*p;
char*s;
p=s;
s=p; //this is wrong ,should do s=(char*)p;
为什么我需要强制转换,因为p
现在包含指针的地址char
并且s
也是char
指针?
为什么以下在 C++ 中是错误的(但在 C 中有效)
void*p;
char*s;
p=s;
s=p; //this is wrong ,should do s=(char*)p;
为什么我需要强制转换,因为p
现在包含指针的地址char
并且s
也是char
指针?
那是有效的 C,但不是 C++;它们是两种不同的语言,即使它们确实有许多共同点。
在 C++ 中,没有从void*
到类型化指针的隐式转换,因此您需要进行强制转换。您应该更喜欢 C++ 强制转换,因为它们限制了允许的转换,因此有助于防止错误:
s = static_cast<char*>(p);
更好的是,您应该首先使用多态技术(例如抽象基类或模板)来避免使用无类型指针;但这超出了这个问题的范围。
值不重要,类型重要。由于p
是 void 指针和s
char 指针,因此您必须进行强制转换,即使它们具有相同的值。在 C 中它会没问题,void*
是通用指针,但这在 C++ 中是不正确的。
顺便说一句,p
不包含 char 指针,它是一个 void 指针,它包含一个内存地址。
一般来说,这条规则甚至与指针没有任何关系。只是您可以将某种类型的值分配给其他类型的变量,但反之亦然。类似的情况是这样的:
double d = 0.0;
int i = 0;
d = i; // Totally OK
i = d; // Warning!
所以这只是你必须忍受的事情。