重複の可能性:
Cのchars[]とchar*sの違いは何ですか?
ステートメントはできますか
char str[]="abcdef";
と
char *str="abcdef";
Cのchar配列と文字列リテラルを説明するために使用されますか?char配列と文字列リテラルの関係は何ですか?文字列リテラルを格納することを除いて、char配列の実際の使用法は何ですか?
重複の可能性:
Cのchars[]とchar*sの違いは何ですか?
ステートメントはできますか
char str[]="abcdef";
と
char *str="abcdef";
Cのchar配列と文字列リテラルを説明するために使用されますか?char配列と文字列リテラルの関係は何ですか?文字列リテラルを格納することを除いて、char配列の実際の使用法は何ですか?
文字列リテラルは、char
変更できない配列です。
C99 6.4.5 p2:
文字列リテラルは、「xyz」のように、二重引用符で囲まれた0個以上のマルチバイト文字のシーケンスです。
そして、C99 6.4.5 p5では:
変換フェーズ7では、値がゼロのバイトまたはコードが、1つまたは複数の文字列リテラルから生じる各マルチバイト文字シーケンスに追加されます。次に、マルチバイト文字シーケンスを使用して、シーケンスを含めるのに十分な静的ストレージ期間と長さの配列を初期化します。文字列リテラルの場合、配列要素の型
char
はであり、マルチバイト文字シーケンスの個々のバイトで初期化されます。
私が持っているドラフトC11にも同様の言い回しがあります。char
文字列リテラルをに割り当てることができるように、正確に「havetype」と表現されていると思いますchar *
。ただし、標準はC996.4.5p6で次のように述べています。
プログラムがそのような配列を変更しようとした場合、動作は未定義です。
したがって、割り当て可能ですが、変更できません。
文字列リテラルは、の配列の初期化子として使用できますchar
。C99 6.7.8 p14から:
文字タイプの配列は、オプションで中括弧で囲まれた文字列リテラルによって初期化できます。文字列リテラルの連続する文字(スペースがある場合、または配列のサイズが不明な場合の終了ヌル文字を含む)は、配列の要素を初期化します。
2番目の割り当ては誤りです。const char *
ポインタに割り当てられた場合、文字列リテラルは定数である必要がありますが、配列を初期化すると変更可能になります。たとえば、への呼び出しで2番目のバージョンを使用することはできませんでしたstrtok()
(理由を確認するには、そのマニュアルページをグーグルで検索してください!)