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

Difference between void pointers in C and C++

本文关键字:空指针 区别 之间 C++      更新时间:2023-10-16

为什么以下内容在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是一个空指针,s是一个字符指针,所以即使它们具有相同的值,也必须进行强制转换。在C中可以,void*是通用指针,但在C++中这是不正确的。

顺便说一句,p不包含字符指针,它是一个空指针,它包含一个内存地址。

通常,此规则甚至与指针无关。只是您可以将某些类型的值分配给其他类型的变量,但并不总是相反。类似的情况是:

double d = 0.0;
int i = 0;
d = i;    // Totally OK
i = d;    // Warning!

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