という事は承知しています
char *s = "Hello World!" ;
は読み取り専用メモリに格納され、ポインタを介して文字列リテラルを変更することはできません。
これはどう違うのですか
const char *s = "Hello World!";
また、「string」のタイプは char * または const char * ですか?
違いは、後者は合法で前者は合法でないことです。これは C++11 で行われた変更です。正式に"Hello World!"は、 type const char[13];を持ちます。に変換できますconst char*。昔は、その型は でchar[13]、 に変換できましたchar*。C++ は を追加して配列の型を変更しましたが、使用されている既存の C コードが C++ で機能するようconstに への変換を維持しましたが、ポインターが指すテキストを変更すると、未定義の動作が発生しました。C++11 は への変換を削除したため、現在は合法的にのみ行うことができますchar*char*char*
const char *s = "Hello world!";
型を asconst char *にすることで、メモリを誤って上書きすることが難しくなります。
const char *s = "Hello World!";
s[0] = 'X'; // compile error
を使用しないconstと、実行時まで問題が検出されないか、プログラムが微妙に間違っている可能性があります。