
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 を用意 |
| 3 | for 文で添え字を0から順に動かす |
| 4 | 各要素を1つずつ代入する |
ここで使っている = は、
- 配列への代入
ではなく - 要素(int型)への代入
です。
この点を混同しないようにしましょう。
図でイメージする配列コピー
配列コピーは、
「箱を丸ごと持ち替える」のではなく、
- 左の箱から
- 右の箱へ
- 中身を1つずつ移す
というイメージです。

for 文は、
この「1つずつ移す作業」を自動化してくれているだけなんですね。
実務でよくハマるポイント
本格的なプログラムを書き始めると、
- 初期データを退避したい
- 元の配列を壊さずに加工したい
- 一時的な作業用コピーがほしい
といった理由で、
配列をコピーしたくなる場面が本当に多くなります。
そのたびに、
backup = original;と書きたくなりますが、
その手は 通用しません。
そんなときは、
今日のこのルールを思い出してください。
まとめ:配列は代入できない、でもコピーはできる
最後に、今回のポイントをまとめます。
- 配列変数に = 演算子で代入はできない。
- 構造体とはルールが違う。
- 配列をコピーしたいときは要素ごとに代入する。
- for 文との組み合わせが基本
このルールを知っているかどうかで、
配列を使ったプログラムの安定感が大きく変わります。
「配列は代入できない」
これは、C言語を使ううえで
必ず覚えておきたい鉄則 です 😊
