C和C++中的空指针之间的区别
Difference between void pointers in C and C++
为什么以下内容在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!
所以这就是你必须接受的东西。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- C和C++中的空指针之间的区别