4

以下が C++ で間違っている理由 (ただし、C では有効)

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

p現在、ポインターのアドレスが含まれており、charポインターでsもあるため、キャストが必要なのはなぜcharですか?

4

3 に答える 3

17

これは有効な C ですが、C++ ではありません。多くの共通の機能があるとしても、これらは 2 つの異なる言語です。

C++ では、 からvoid*型付きポインターへの暗黙的な変換がないため、キャストが必要です。許可される変換を制限し、間違いを防ぐのに役立つため、C++ キャストを優先する必要があります。

s = static_cast<char*>(p);

さらに良いことに、そもそも型指定されていないポインターを使用する必要がないように、ポリモーフィック手法 (抽象基本クラスやテンプレートなど) を使用する必要があります。しかし、それはこの質問の範囲を超えています。

于 2013-07-24T12:23:21.070 に答える
8

値は重要ではなく、型は重要です。pは void ポインターとchar ポインターであるためs、同じ値であってもキャストする必要があります。C ではvoid*一般的なポインターで問題ありませんが、C++ では正しくありません。

ちなみに、char ポインターは含まれpていません。これは void ポインターであり、メモリ アドレスが含まれています。

于 2013-07-24T12:22:14.330 に答える
0

一般に、この規則はポインターとは何の関係もありません。あるタイプの値を他のタイプの変数に割り当てることができるというだけですが、常にその逆になるとは限りません。同様の状況は次のようになります。

double d = 0.0;
int i = 0;

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

だから、それはあなたが生きなければならないものです。

于 2013-07-24T12:25:52.167 に答える