C言語入門|配列の代入はできない

配列の注意点を学んでいると、
多くの人が必ず一度は、こう思います。

「構造体は = でコピーできたのに、
 配列も同じようにできるんじゃないの?」

気持ちは、とてもよく分かります 😊
でも、ここでしっかり覚えておいてほしい大事なルールがあります。

C言語では、配列は代入できません。

今回はこの「えっ、できないの?」となりやすいポイントを、
理由と正しい対処法と一緒に見ていきましょう。

配列に = 演算子は使えない

まずは、よくやってしまう例からです。

int data1[4] = {5, 10, 15, 20};
int data2[4];

data2 = data1;   // NG!

このコードは、
コンパイルエラー になります。

構造体では、

struct A x;
struct A y;

y = x;   // OK

という書き方ができましたよね。

それと同じ感覚で書いてしまいがちですが、
配列ではこれは許されていません。

なぜ配列は代入できないの?

理由をひとことで言うと、

配列は代入可能な「値」ではない

からです。

配列は、

  • たくさんの要素をまとめたもの
  • メモリ上に連続して配置された領域

という存在です。

C言語では、

  • 構造体 → 値として丸ごと扱える。
  • 配列 → 値としては扱えない。

という、はっきりした違いがあります。

そのため、

b = a;

のように
配列全体を一気にコピーする操作は定義されていない
というわけです。

構造体との違いを表で整理しよう

ここで、構造体と配列の違いを整理してみましょう。

項目構造体配列
型の分類集成体型集成体型
= による代入できるできない
コピー方法= 演算子要素ごとにコピー
扱い方値として扱える領域として扱われる

同じ集成体型でも、
代入に関するルールはまったく違う
という点が重要です。

配列をコピーしたいときはどうする?

では、配列の内容をコピーしたいときは、どうすればよいのでしょうか。

答えはとてもシンプルです。

要素を1つずつコピーする

これが、C言語での正しいやり方です。

正しい配列コピーの例

ここでは、
「4日分の売上データ」をコピーする例にしてみます。

#include <stdio.h>

int main(void)
{
    int salesA[4] = {120, 150, 180, 200};
    int salesB[4];

    for (int i = 0; i < 4; i++) {
        salesB[i] = salesA[i];
    }

    for (int i = 0; i < 4; i++) {
        printf("salesB[%d] = %d\n", i, salesB[i]);
    }

    return 0;
}

このプログラムでやっていること

処理の流れを整理すると、次のようになります。

ステップ内容
1コピー元の配列 salesA を用意
2コピー先の配列 salesB を用意
3for 文で添え字を0から順に動かす
4各要素を1つずつ代入する

ここで使っている = は、

  • 配列への代入
    ではなく
  • 要素(int型)への代入

です。

この点を混同しないようにしましょう。

図でイメージする配列コピー

配列コピーは、
「箱を丸ごと持ち替える」のではなく、

  • 左の箱から
  • 右の箱へ
  • 中身を1つずつ移す

というイメージです。

for 文は、
この「1つずつ移す作業」を自動化してくれているだけなんですね。

実務でよくハマるポイント

本格的なプログラムを書き始めると、

  • 初期データを退避したい
  • 元の配列を壊さずに加工したい
  • 一時的な作業用コピーがほしい

といった理由で、
配列をコピーしたくなる場面が本当に多くなります。

そのたびに、

backup = original;

と書きたくなりますが、
その手は 通用しません

そんなときは、
今日のこのルールを思い出してください。

まとめ:配列は代入できない、でもコピーはできる

最後に、今回のポイントをまとめます。

  • 配列変数に = 演算子で代入はできない。
  • 構造体とはルールが違う。
  • 配列をコピーしたいときは要素ごとに代入する。
  • for 文との組み合わせが基本

このルールを知っているかどうかで、
配列を使ったプログラムの安定感が大きく変わります。

「配列は代入できない」
これは、C言語を使ううえで
必ず覚えておきたい鉄則 です 😊