C++の配列アクセスと下付き演算子 [] を徹底解説!初心者でもわかるメモリの仕組み
生徒
「C++でたくさんのデータをまとめて管理する方法はありますか?出席番号順に名前を並べるようなイメージです!」
先生
「それなら『配列(はいれつ)』という機能がぴったりですよ。そして、その中から特定のデータを取り出すには『下付き演算子(したつきえんざんし)』という記号を使います。」
生徒
「シタツキ……?難しそうな名前ですね。具体的にはどうやって書くんですか?」
先生
「実はとっても簡単、カギカッコ [] を使うだけなんです。プログラミング特有の数え方のルールと一緒に学んでいきましょう!」
1. 配列と下付き演算子の役割とは?
C++プログラミングにおける配列とは、同じ種類のデータを一列に並べて管理するための「連続した箱」のことです。例えば、テストの点数を5人分保存したいとき、変数を5個作るのではなく、5つの部屋がある1つの配列を作るほうが効率的です。
この配列の中にある特定の部屋を指定して、データを入れたり出したりするために使うのが下付き演算子(添字演算子)です。見た目は [] というカギカッコの形をしています。このカッコの中に、何番目の部屋を見たいかという番号を指定します。この番号のことを専門用語で添字(そえじ)またはインデックスと呼びます。配列と下付き演算子をマスターすれば、大量のデータを一瞬で処理するプログラムが書けるようになります。
2. インデックスは「0」から始まるルール
パソコンを初めて触る人が一番驚くルールがこれです。プログラミングの世界では、数は「0」から数え始めます。 1番目の部屋にアクセスしたいときは [0]、2番目は [1] と書きます。なぜ 1 からではないのでしょうか?
これは、配列の開始地点からの「距離」を表しているからです。最初の部屋は開始地点そのものなので、距離は 0 です。次の部屋は 1 つ隣にあるので、距離は 1 になります。この「0から始まる」というルールを忘れてしまうと、意図しない場所のデータを書き換えてしまう原因になるので、しっかり体に染み込ませましょう。例えば、5つの要素がある配列の最後の部屋は [4] になります。
3. 配列を作って中身を表示してみよう
それでは、実際にC++のコードを書いて配列を使ってみましょう。ここでは、3つの整数を保存する配列を作り、下付き演算子を使ってそれぞれの値を取り出してみます。
#include <iostream>
int main() {
// 3つの整数が入る配列「numbers」を作成
int numbers[3] = {10, 20, 30};
// 下付き演算子 [] を使ってアクセス
std::cout << "0番目の部屋: " << numbers[0] << std::endl;
std::cout << "1番目の部屋: " << numbers[1] << std::endl;
std::cout << "2番目の部屋: " << numbers[2] << std::endl;
return 0;
}
このプログラムを実行すると、それぞれの部屋に保存された数字が表示されます。 numbers[1] と書くだけで、配列の中の特定の場所を指し示すことができるのが便利ですね。
0番目の部屋: 10
1番目の部屋: 20
2番目の部屋: 30
4. 下付き演算子を使って値を書き換える
下付き演算子は、中身を見るだけでなく、中身を書き換える(代入する)ときにも使います。配列は一度作ったら中身が変えられないわけではありません。部屋番号を指定して、新しいデータを上書きすることができます。
まるでアパートの住人が入れ替わるように、特定のインデックスを指定して値を代入します。以下のコードで、途中で値が変わる様子を確認してください。
#include <iostream>
int main() {
int scores[2] = {80, 95};
std::cout << "元の点数: " << scores[0] << std::endl;
// 0番目の部屋の値を100に書き換える
scores[0] = 100;
std::cout << "書き換え後の点数: " << scores[0] << std::endl;
return 0;
}
実行結果を見ると、最初の値が消えて、新しく入れた 100 が保存されていることがわかります。このように、下付き演算子はデータの読み取りと書き込みの両方で主役となります。
元の点数: 80
書き換え後の点数: 100
5. 範囲外アクセスに注意しよう
配列を使う上で、最も注意しなければならないのが範囲外(ほういがい)アクセスです。例えば、部屋が3つしかない配列に対して [5] 番目の部屋を見ようとすることです。これは、存在しない住所に手紙を出すようなもので、非常に危険な行為です。
C++は自由度が高いプログラミング言語なので、間違えて範囲外を指定しても、すぐにはエラーを出さずに動いてしまうことがあります。しかし、実際にはパソコン内の他の大事なデータを壊していたり、突然プログラムが強制終了したりする原因になります。配列の大きさが N なら、使える番号は 0 から N-1 までであるという原則を常に意識しましょう。
6. 繰り返し文と組み合わせる強力なテクニック
下付き演算子の本当のパワーは、ループ(繰り返し)処理と組み合わせたときに発揮されます。カギカッコの中の数字を変数にすることで、何百、何千というデータをたった数行のコードで処理できるようになります。
ここでは for 文という繰り返し命令を使って、配列の全データを順番に表示するテクニックを見てみましょう。変数の値が 0, 1, 2 と変化することで、アクセスする部屋も自動的に切り替わります。
#include <iostream>
int main() {
double heights[4] = {165.5, 172.0, 158.2, 180.5};
// i が 0 から 3 まで繰り返される
for (int i = 0; i < 4; i++) {
std::cout << i << "人目の身長: " << heights[i] << "cm" << std::endl;
}
return 0;
}
このように書けば、たとえ人数が 100 人に増えても、ループの回数を変えるだけで済みます。手作業で 100 回 std::cout と書く必要はもうありません。
0人目の身長: 165.5cm
1人目の身長: 172cm
2人目の身長: 158.2cm
3人目の身長: 180.5cm
7. 文字列も実は配列のようなもの?
実は、C++で文字を扱うときも下付き演算子 [] を使うことができます。文字列(文章)は、一文字一文字が配列の部屋に並んでいるような構造をしているからです。
例えば、「HELLO」という言葉の 1 文字目だけを取り出したり、小文字を大文字に変えたりすることも、配列と同じ下付き演算子の操作で実現できます。文字もデータの一種であり、パソコンの中では番号で管理されていることが実感できるはずです。文字列の特定の文字を書き換えるコードを試してみましょう。
#include <iostream>
#include <string>
int main() {
std::string text = "Cat";
// 0番目の文字 'C' を 'R' に変更
text[0] = 'R';
std::cout << "結果: " << text << std::endl; // Rat になる
return 0;
}
この柔軟性がC++の魅力です。データがどのように並んでいるかをイメージできるようになると、プログラミングがどんどん楽しくなっていきます。
8. メモリの住所と演算子の深い関係
少し難しいお話になりますが、下付き演算子が裏側で何をしているかを説明します。パソコンのメモリには、データが保存されている場所に「住所(アドレス)」が割り振られています。配列の名前は、実はその「最初の部屋の住所」を指しています。
下付き演算子 [i] を使うと、コンピュータは「最初の住所から i 個分だけ進んだ場所にあるデータを持ってきて!」という計算を瞬間的に行います。この高速なアクセスが可能なため、C++はゲーム制作やロボット制御などの速度が求められる分野で重宝されています。仕組みを知ることで、なぜ 0 番目から始まるのかという疑問も解消されますね。住所に 0 を足せば最初の場所、1 を足せば次の場所、という非常にシンプルな算数で動いているのです。
9. モダンなC++での安全なアクセス方法
最後に、これまでの [] とは別の、より安全な方法も紹介しておきます。最近のプログラミングでは、 at() という機能を使うことがあります。これは、もし間違えて範囲外を指定してしまったときに、「範囲外ですよ!」とプログラムが親切に教えてくれる機能です。
[] は速度を最優先するため、間違いを教えてくれません。一方で at() は少しだけ実行速度は落ちますが、安全性を高めてくれます。初心者のうちは、この安全な道具を使い分けることも大切です。用途に合わせて、スピード重視の [] か、安全重視の at() かを選ぶのがプロの技です。まずは基本の下付き演算子を使いこなし、慣れてきたらより高度な機能にも挑戦していきましょう。