C言語の配列って、プログラミング学習でよく耳にするけど、なんだか掴みどころがない…なんて思っていませんか?
この記事では、C言語プログラミングの基本となる「配列」について、その正体から実際の使い方、そして気をつけたいポイントまで、どこよりも分かりやすく解説していきます。
この記事を読むと、こんなことができるようになります!
- 配列が何なのか、なぜ便利なのかがわかる
- 配列の基本的な書き方(宣言と初期化)を覚えられる
- 配列のデータをプログラムで扱う方法が身につく
- 配列を使うときの注意点がわかる
難しそうに見える配列も、基本を押さえれば怖くありません。さあ、配列マスターへの第一歩を、一緒に踏み出してみましょう!きっと「なるほど!」と思えるはずです。
C言語の「配列」とは?なぜ必要なのかを理解しよう
まず、配列って一体何者なんでしょう?簡単に言うと、同じ種類のデータをたくさんまとめて入れておける箱のようなものです。
例えば、クラスの生徒5人分のテストの点数を記録したいとします。配列を使わないと、こんな感じになります。
int score1 = 80; int score2 = 75; int score3 = 92; int score4 = 68; int score5 = 88;
これでもいいのですが、生徒が100人いたら大変ですよね?変数を100個も書くのは骨が折れますし、管理も面倒です。
そこで登場するのが配列!配列を使えば、こんな風にスッキリ書けます。
int scores[5]; // 5人分の点数を入れる箱(配列)を用意
このように、配列はたくさんのデータを効率よく扱うために欠かせない仕組みなのです。プログラムを書く上で、データを整理整頓するための便利な道具箱だと考えてみてください。
配列の基本的な考え方
配列をもう少し詳しく見ていきましょう。配列には2つの構成要素があります。
- 要素(Element): 配列の中に入っている個々のデータのことです。上の例でいうと、一人一人の点数が要素にあたります。
- 添え字(Index / インデックス): 配列のどの場所のデータかを指し示す番号のことです。住所の番地のようなものですね。
ここでC言語の配列で最も大事なルールのひとつがあります。それは、添え字は必ず0から始まるということです!
例えば、要素数が5の配列 `scores[5]` の場合、使える添え字は 0, 1, 2, 3, 4 の5つです。 `scores[0]` が最初の要素、 `scores[4]` が最後の要素になります。 `scores[5]` は存在しない(箱の外)ので注意しましょう。
(ここに図:箱が5つ横に並んでいて、それぞれに 0, 1, 2, 3, 4 と番号が振られているイメージ)
この「0から始まる」という感覚に慣れることが、配列を使いこなす第一歩になりますよ。
C言語での配列の「書き方」:宣言と初期化をマスター
配列を使うには、まず「こんな配列を使いますよー!」とコンピューターに教えてあげる必要があります。これを配列の宣言と呼びます。そして、宣言と同時に最初の値を入れておくことを初期化といいます。この2つの書き方を覚えましょう。
配列の宣言方法
配列の宣言は、次のルールで書きます。
データ型 配列名[要素数];
具体例を見てみましょう。
// int型(整数)の要素を5個持つ配列 score を宣言 int score[5]; // float型(小数点数)の要素を10個持つ配列 temperatures を宣言 float temperatures[10]; // char型(文字)の要素を20個持つ配列 name を宣言(文字列を扱うのによく使われます) char name[20];
ポイントは、[ ] の中に、配列にいくつの要素を入れたいか(要素数)を必ず書くことです。これで、コンピューターは必要なメモリ領域を確保してくれます。
配列の初期化:値をまとめて設定する
配列を宣言するときに、一緒に最初の値(初期値)を入れておくことができます。これが初期化です。初期化は `{ }` (波括弧)を使います。
// 宣言と同時に初期値を設定 int numbers[5] = {10, 20, 30, 40, 50}; // 初期値の数が要素数より少ない場合、残りは0で初期化される (C言語の仕様) // results[0]=100, results[1]=90, results[2]=0, results[3]=0, results[4]=0 となる int results[5] = {100, 90}; // 要素数を省略して、初期値の数から自動で要素数を決めることもできる // この場合、data配列の要素数は 3 になる int data[] = {5, 15, 25};
初期化を使うと、コードがスッキリして分かりやすくなることが多いです。特に、決まった値を入れておきたい場合に便利ですね。
C言語の配列の「使い方」:要素へのアクセスと繰り返し処理
さあ、配列を宣言したり初期化したりする方法がわかりました。
次は、実際にプログラムの中で配列のデータをどうやって使っていくかを見ていきましょう。配列の特定の場所にデータを入れたり、取り出したり、たくさんのデータをまとめて処理したりする方法を学びます。
配列の要素にアクセスする(代入と参照)
配列の中の特定のデータ(要素)にアクセスするには、配列名[添え字]
という形で書きます。これを使って、値を代入したり、値を取り出して表示したりできます。
値を代入する例:
#include <stdio.h> int main(void) { int score[3]; // 要素数3のint型配列を宣言 // 添え字を使って各要素に値を代入 score[0] = 85; // 最初の要素 (添え字0) に85を代入 score[1] = 90; // 2番目の要素 (添え字1) に90を代入 score[2] = 77; // 3番目の要素 (添え字2) に77を代入 printf("score[1]の値は %d です。\n", score[1]); // 添え字1の要素の値を表示 return 0; }
ソースコードの表示結果:
score[1]の値は 90 です。
値を取り出す(参照する)例:
#include <stdio.h> int main(void) { int data[] = {10, 20, 30}; // 初期化済みの配列 int sum; // 配列の要素を使って計算 sum = data[0] + data[1] + data[2]; printf("合計値は %d です。\n", sum); // 計算結果を表示 return 0; }
ソースコードの表示結果:
合計値は 60 です。
このように、添え字を指定することで、配列の中の狙った場所にアクセスできるのがポイントです。添え字が0から始まることを忘れずに!
ループ(for文)を使った配列の処理
配列の便利な点は、たくさんのデータをまとめて扱えることです。そして、その真価を発揮するのがループ処理、特にfor
文との組み合わせです。
例えば、配列の全ての要素に順番にアクセスして何か処理をしたい場合、for文を使うと非常に簡潔に書けます。
for文で配列の全要素を表示する例:
#include <stdio.h> int main(void) { int numbers[5] = {11, 22, 33, 44, 55}; int i; printf("配列 numbers の中身:\n"); // for文で添え字を 0 から 4 まで変化させながらアクセス for (i = 0; i < 5; i++) { printf("numbers[%d] = %d\n", i, numbers[i]); } return 0; }
ソースコードの表示結果:
配列 numbers の中身: numbers[0] = 11 numbers[1] = 22 numbers[2] = 33 numbers[3] = 44 numbers[4] = 55
for文で配列の合計値を計算する例:
#include <stdio.h> int main(void) { int sales[4] = {100, 150, 80, 200}; int total = 0; // 合計値を初期化 int i; // for文で全要素を足し合わせる for (i = 0; i < 4; i++) { total = total + sales[i]; // total += sales[i]; とも書ける } printf("売上合計: %d\n", total); return 0; }
ソースコードの表示結果:
売上合計: 530
このように、for文と配列を組み合わせることで、大量のデータに対する処理を効率的に記述できるようになります。ループ変数 `i` が添え字として使われている点に注目してください。
C言語で配列を使う上での「注意点」
配列はとても便利ですが、いくつか気をつけるべき点があります。特に初心者のうちは、これらの注意点を知らずにプログラムがうまく動かない…なんてことも。しっかり確認しておきましょう。
配列の範囲外アクセスに注意!
これが配列を使う上で最もやってはいけない、そして最も起こりがちなミスの一つです。それは、配列として用意した範囲を超えた添え字でアクセスしてしまうことです。
例えば、`int data[5];` と宣言した場合、使える添え字は 0, 1, 2, 3, 4 ですよね。ところが、うっかり `data[5]` や `data[-1]` のような、範囲外の添え字を使ってしまうとどうなるでしょう?
C言語では、このような範囲外アクセスをしても、コンパイル(プログラムの翻訳)の段階ではエラーにならないことが多いのです。しかし、プログラムを実行したときに、
- 関係ないメモリ領域の値を書き換えてしまい、プログラム全体がおかしな動きをする
- プログラムが突然強制終了してしまう(セグメンテーション違反など)
- 見た目上は動いているように見えても、裏で予期せぬ問題を引き起こしている
といった、非常に深刻な問題を引き起こす可能性があります。これはバッファオーバーラン(またはバッファオーバーフロー)と呼ばれる、重大なバグやセキュリティ上の弱点につながる危険な操作です。
NGコード例:
#include <stdio.h> int main(void) { int arr[3] = {1, 2, 3}; int i; // ループの条件が間違っている! (i <= 3 だと i が 3 になる) // arr[3] は範囲外アクセス! for (i = 0; i <= 3; i++) { printf("arr[%d] = %d\n", i, arr[i]); // ここで問題発生の可能性 } return 0; }
このコードは、`i`が3になったときに `arr[3]` にアクセスしようとしますが、`arr`の有効な添え字は0, 1, 2までです。何が表示されるか、あるいはエラーになるかは、実行環境によって異なりますが、絶対に避けるべきコードです。
for文のループ条件(特に `i < 要素数` の部分)などを書くときは、常に配列の範囲を意識するように心がけましょう。
配列のサイズは後から変更できない
C言語でこれまで見てきた方法(int data[5];
のような書き方)で宣言した配列は、静的配列と呼ばれます。この静的配列の大きな特徴は、一度宣言したら、プログラムの実行中にそのサイズ(要素数)を変更できないということです。
int score[5]; // 要素数5で宣言したら、ずっと5個分の領域 // score[10] = 100; // これはダメ! (範囲外アクセス) // score配列を後から要素数10に増やす、みたいなことは基本的にはできない
もし、プログラムを実行してみないとデータがいくつになるか分からない、というような状況で配列を使いたい場合は、「動的メモリ確保」という、もう少し発展的なテクニック(`malloc`関数など)を使う必要があります。ただ、まずは基本の静的配列をしっかり理解することが先決です。
「最初に決めたサイズから変えられない」という点を覚えておきましょう。
【まとめ】C言語の配列を理解して活用しよう!
お疲れ様でした!今回はC言語の「配列」について、基本的なところから見てきました。
ポイントを振り返ってみましょう。
- 配列は、同じ種類のデータをまとめて扱うための箱。
- 宣言は `データ型 配列名[要素数];` で行う。
- 初期化は `{ }` を使って宣言と同時にできる。
- 要素へのアクセスは `配列名[添え字]` で、添え字は0から始まる!
- for文と組み合わせると、たくさんのデータを効率よく処理できる。
- 最大の注意点は「範囲外アクセス」。絶対に避けること。
- 一度決めた配列のサイズは、後から変更できない(静的配列の場合)。
配列は、C言語だけでなく、多くのプログラミング言語で使われる基本中の基本となる考え方です。最初は添え字の扱いに少し戸惑うかもしれませんが、慣れてくればプログラムでできることの幅がぐっと広がります。
この記事のサンプルコードを実際に自分で打ち込んで動かしてみたり、少し改造してみたりすると、より理解が深まるはずです。ぜひ、恐れずに配列を使ってみてくださいね!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。