C の配列は、代入もコピー初期化もできません。これが C における配列のあり方です。歴史的に、値のコンテキスト (割り当ての右辺) では、配列はポインターに減衰します。これは、配列だけでなく、すべての配列に適用されchar
ます。
C 言語は、その前身である B および BCPL 言語からこの配列の動作を継承しています。これらの言語では、配列は物理ポインターで表されていました。(また、ある配列を別の配列に代入するときに、ポインターの再代入が発生することを望まないことは明らかです。) C 言語の配列はポインターではありませんが、減衰によって B および BCPL 配列の歴史的な動作を「シミュレート」します。ほとんどの場合、ポインターに。この歴史的遺産が、今日まで C 配列をコピー不可能にしている理由です。
上記の 1 つの例外は、文字列リテラルを使用した初期化です。つまり、できる
char c[] = "abc";
この場合、概念的には文字列リテラルを配列にコピーしています。もう 1 つの例外は、構造体オブジェクト全体がコピーされるときにコピーされる、構造体型にラップされた配列です。そしてそれはそれについてです。"abc"
c
これは、ネイキッド (ラップされていない) 配列をコピーするときはいつでも、ライブラリ レベルのメモリ コピー関数 ( memcpy
. strcpy
は、文字列で動作するように特別に調整されたものの単なるフレーバーです。