C和C++; 为什么C++中的错误是错误的(但在C中有效)

C和C++; 为什么C++中的错误是错误的(但在C中有效),c++,C++,为什么我需要强制转换,因为p现在包含char指针的地址,s也是char指针?值不重要,类型重要。由于p是一个空指针,而s是一个字符指针,因此您必须强制转换,即使它们具有相同的值。在C中它将是好的, Value*/Cuff>是泛型指针,但是在C++中这是不正确的。 顺便说一下,p不包含char指针,它是一个空指针,并且包含一个内存地址。值不重要,类型重要。由于p是一个空指针,而s是一个字符指针,因此您必须强制转换,即使它们具有相同的值。在C中它将是好的, Value*/Cuff>是泛型指针,但是在

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

值不重要,类型重要。由于
p
是一个空指针,而
s
是一个字符指针,因此您必须强制转换,即使它们具有相同的值。在C中它将是好的,<代码> Value*/Cuff>是泛型指针,但是在C++中这是不正确的。
顺便说一下,
p
不包含char指针,它是一个空指针,并且包含一个内存地址。

值不重要,类型重要。由于
p
是一个空指针,而
s
是一个字符指针,因此您必须强制转换,即使它们具有相同的值。在C中它将是好的,<代码> Value*/Cuff>是泛型指针,但是在C++中这是不正确的。

顺便说一下,P不包含字符指针,它是一个空指针,包含内存地址。< /P> < P>这是有效的C,而不是C++;它们是两种不同的语言,即使它们有许多共同的特性

<>在C++中,没有从代码>虚空*/COD>到类型指针的隐式转换,所以需要一个强制转换。您应该更喜欢C++的CAST,因为它们限制了哪些转换是允许的,因此有助于防止错误:

s = static_cast<char*>(p);
s=static_cast(p);

更好的是,您应该使用多态技术(例如抽象基类或模板),以避免首先使用非类型指针;但是这超出了这个问题的范围。< /P> < P>这是有效的C,而不是C++;它们是两种不同的语言,即使它们有许多共同的特性

<>在C++中,没有从代码>虚空*/COD>到类型指针的隐式转换,所以需要一个强制转换。您应该更喜欢C++的CAST,因为它们限制了哪些转换是允许的,因此有助于防止错误:

s = static_cast<char*>(p);
s=static_cast(p);

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

一般来说,这个规则甚至与指针没有任何关系。只是可以将某些类型的值分配给其他类型的变量,但不总是相反。类似的情况如下:

double d = 0.0;
int i = 0;

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

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

一般来说,这条规则甚至与指针没有任何关系。只是可以将某些类型的值分配给其他类型的变量,但不总是相反。类似的情况如下:

double d = 0.0;
int i = 0;

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

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

p不是字符指针。通过将
s
的值分配给
p
,您也没有分配类型。(顺便说一下,您的指针都未初始化,因此它们的值是不确定的。)如果将int指针分配给p,那么s=p会发生什么?p不是字符指针。通过将
s
的值赋给
p
,您并没有同时赋给类型。(顺便说一下,您的指针都未初始化,所以它们的值是不确定的。)如果您将int指针赋给p,然后s=p会发生什么情况?@Hulk感谢Hulk,这只是一个mistake@Hulk谢谢绿巨人,这只是一个错误什么是“警告!”应该是什么意思?你说我们不能从某些类型分配到其他类型,但你的摘录如何证明这一点?它的编译和运行都很好——因为正如相反,
double
有一个隐式(如果可能缩小)转换为
int
@underline\d,这就是我的意思,可能缩小的位。您可以在g++中启用此警告,并使用
-Wconversion
发出叮当声。请注意,在另一个方向上的分配没有警告。这就解释了这一点。不过,我仍然不明白这与
void*
和这个问题有什么关系;我错过了什么?隐式指针转换是否有效;它们不能变窄,但允许变窄。真正的答案似乎是C和C++之间的“有效”定义发生了变化。相比之下,我很确定不相关数字类型的缩小规则没有。什么是“警告!”应该是什么意思?你说我们不能从某些类型分配到其他类型,但你的摘录如何证明这一点?它的编译和运行都很好——因为正如相反,
double
有一个隐式(如果可能缩小)转换为
int
@underline\d,这就是我的意思,可能缩小的位。您可以在g++中启用此警告,并使用
-Wconversion
发出叮当声。请注意,在另一个方向上的分配没有警告。这就解释了这一点。不过,我仍然不明白这与
void*
和这个问题有什么关系;我错过了什么?隐式指针转换是否有效;它们不能变窄,但允许变窄。真正的答案似乎是C和C++之间的“有效”定义发生了变化。相比之下,我很确定不相关数字类型的缩小规则没有。