という事は承知しています
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
と、実行時まで問題が検出されないか、プログラムが微妙に間違っている可能性があります。