C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
配列とは
C++において、配列とは同じデータ型の要素を保持する固定サイズの連続したメモリブロックです。0から始まるインデックスで各要素にアクセスできる、値のコレクションを表す単一の変数と考えることができます。
配列は関連する値をグループ化することでデータ処理を簡素化し、効率的な走査、ランダムアクセス、一括操作を可能にします。
なぜ配列を使うのか
- 同種データのコンパクトな表現
- 定数時間でのインデックスアクセス(
O(1)) - 順次処理や行列風処理を必要とするアルゴリズムとの親和性が高い
配列の宣言
構文:
type arrayName[arraySize];
- type:有効なC++データ型(例:
int、double、char) - arrayName:配列の識別子
- arraySize:要素数を指定する正の整数
例:int age[5];は5つの整数分の領域を確保します。
配列の初期化
値は宣言時または後から設定できます:
int age[5] = {19, 18, 21, 20, 17};
arraySizeを省略するとコンパイラがサイズを推論します:
int age[] = {19, 18, 21, 20, 17};
個別の要素はインデックスで代入可能:
age[3] = 20; // 4番目の要素
配列の種類
- 1次元配列(1D)
- 多次元配列(2D、3D、…)
- 配列へのポインタ
1次元配列
標準的な線形格納:
int age[5] = {19, 18, 21, 20, 17};
走査例:
#include <iostream>
using namespace std;
int main() {
int age[5] = {19, 18, 21, 20, 17};
for (int i = 0; i < 5; ++i) {
cout << age[i] << "\n";
}
return 0;
}
出力:
2次元配列(行列)
構文:type arrayName[rows][cols];
int matrix[2][3] = {{0, 2, 1}, {4, 3, 7}};
アクセスパターン:matrix[row][col]。走査例:
#include <iostream>
using namespace std;
int main() {
int a[3][2] = {{0, 2}, {1, 4}, {3, 7}};
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
cout << "a[" << i <<"] [" << j <<"] = " << a[i][j] << endl;
}
}
return 0;
}
出力:
3次元配列
データの立方体を表現:
#include <iostream>
using namespace std;
int main() {
int a[2][3][2] = {
{{4, 8}, {2, 4}, {1, 6}},
{{3, 6}, {5, 4}, {9, 3}}
};
cout << "a[0][1][0] = " << a[0][1][0] << "\n";
cout << "a[0][1][1] = " << a[0][1][1] << "\n";
return 0;
}
出力:
配列へのポインタ
配列名は最初の要素へのポインタに変換されます。例:
#include <iostream>
using namespace std;
int main() {
int age[5] = {19, 18, 21, 20, 17};
int *p = age; // pはage[0]を指す
cout << "Address: " << p << "\n";
cout << "First value: " << *p << "\n";
return 0;
}
算術演算によるアクセス:
for (int i = 0; i < 5; ++i) {
cout << "*(p + " << i <<") = " << *(p + i) << endl;
}
要素へのアクセス
インデックス演算子[ ]を使用:
int john = age[2]; // 3番目の要素
完全な例:
#include <iostream>
using namespace std;
int main() {
int age[5] = {19, 18, 21, 20, 17};
int john = age[2];
cout << "The age of John is: " << john;
return 0;
}
C++配列の利点
- 高速な順次走査
- O(1)ランダムアクセス
- 動的割り当て不要でメモリオーバーヘッドが低い
- アルゴリズム最適化を容易にする(キャッシュフレンドリーなループなど)
- 言語と標準ライブラリに組み込みサポート
C++配列の欠点
- 固定サイズ—宣言後にリサイズ不可
- インデックス管理を誤るとアウトオブバウンズエラーのリスク
- 宣言サイズが実際の使用量を超えるとメモリ浪費
- 標準配列には境界チェックなし(安全性を求めるなら
std::arrayやstd::vectorを使用)
まとめ
- 配列は単一型の要素を保持する連続メモリブロック
- インデックスは0開始;最後のインデックスは
size-1 type name[size];で宣言し、{ }または個別に初期化- 1次元配列は線形格納;2次元・3次元配列は行列やテンソルをモデル化
- 配列へのポインタで柔軟なインデックスと算術アクセスが可能
- サイズが既知で性能が重要なら配列、そうでなければ
std::vectorやstd::arrayを推奨
C言語