- 締切済み
ポインタについて
こんばんは。 const char *pp; char c; const char cc = 'e'; char *p; 1・・・pp = &c; 2・・・p = &cc; 2番目はconst char *型はchar *型に変換できないと言われます。1番目も、同じだと思うのですがこのエラーメッセージが出てきません。なぜでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kakusuke
- ベストアンサー率36% (95/259)
ppの実体は変更できないけど、 pの実体は変更できてしまうから。 つまり、*ppは値を変更しない。 *pは値を変更してしまう。 ということ。
- jacta
- ベストアンサー率26% (845/3158)
C++でしょうか? C言語であれば、警告が出ることはあっても、エラーにはならないはずです。
- KoHal
- ベストアンサー率60% (110/181)
非constオブジェクトへのポインタ(またはレファレンス)からconstオブジェクトへのポインタ(またはレファレンス)への暗黙のキャストは認められますが、その逆は認められません。 const → 書き換えることはできない 非const → 書き換えることができる ですから、非const→constへの変換は別に不都合は生じませんが、const→非constへの変換は、書き換えてはならないものを書き換えてしまう可能性があるので不都合が生じます。 よってconst→非constは暗黙にはキャストされないと定められています。 どうしてもこのようなキャストが必要であれば明示的にキャストする必要があります。
- a-saitoh
- ベストアンサー率30% (524/1722)
1は逆で,char*をconst char*に代入しているのですから,扱いは違います. constは書換え禁止と思えばいいですが,constのついていないcharは書換え「てもかまわない」だけで書き換えなくても別に違反ではありません. pp=&cc;とするのは,pp経由(*pp)ではcを書き換えるつもりはない,というだけの事だとおもいますよ.