chars(char str[]
)の配列を宣言すると、内部の任意の文字を変更できます。ただし、その配列をこのように宣言すると、char* str="abcd";
内部の文字を変更することは不可能です。何故ですか?それらは両方とも同じものであるべきではありませんか?
4 に答える
文字の配列を宣言するとき
char myarr[5] = "abcd";
それはあなたの配列です。abcdの文字はローカル配列内にコピーされ、自由に使用できます。C ++の文字列リテラル( ""の文字列)はタイプconst char[N]
です。あなたはそれへのポインタを保存することができます
const char* p = "abcd"
ここで、pはconstであるため、文字列リテラルを変更することはできません。これは良いことです。残念ながら、歴史的な理由により、文字列リテラルからへの暗黙の変換が存在しますchar*
char * p = "abcd"
この場合、残念ながら文字列リテラルを変更できますが、変更すると未定義の動作になります。幸い、この変換は非推奨です。
これは文字列リテラルに固有の問題であることに注意してください。これは、左辺値である唯一のタイプのリテラルであるためです。他のすべてのリテラルは右辺値であるため、それらを変更する概念はありません。
char*
文字列用のスペースを予約して、Read Only Memory
変更できないようにします。一方char str[]
、スタック上にあります。タイプの変数はのようにchar*
動作するconst
ため、変更することはできません。
前者の場合、配列を次のように宣言します。
char str[SIZE];
割り当てられたメモリはプログラムに属し、変更できます。
後者の場合、
char* str="abcd" ; // str is a pointer to string literal, essential makes it a const char *
読み取り専用のメモリ位置に書き込もうとしていますが、動作は定義されていません。
array of char
=を作成するchar[]
と、スタックに配置したシンボルを含むスペースが予約されます+ \0
。スタック上にあるので、書き込むことができます。
しかしchar *pc = "abcd"
、プログラムの読み取り専用部分に文字列「abcd」を作成するようなものです。読み取り専用の文字列またはむしろを指すポインタがありますconst char*
。