の配列 C++ | 宣言 | 初期化 | 配列へのポインターの例
配列とは何ですか?
配列は、同じデータ型の要素を順番に格納するデータ構造です。 C++ 配列のサイズは固定です。
配列は、同様のデータ型の変数のコレクションとして見ることができます。 各変数を宣言して値を個別に割り当てる代わりに、XNUMX つの変数 (配列) を宣言し、そこにさまざまな変数の値を追加できます。 配列に追加された各値はインデックスによって識別されます。
なぜ配列が必要なのでしょうか?
配列 どのプログラミング言語においても非常に重要です。 これらは、変数または同様のデータ型のデータのコレクションを個別に保存するのではなく、一緒に保存するためのより便利な方法を提供します。 配列の各値は個別にアクセスされます。
配列を宣言する C++
配列宣言 C++ 配列に格納される要素の型と数を指定します。構文:
type array-Name [ array-Size ];
1次元配列を宣言するためのルール C++.
- 種類: 型は配列に格納される要素の型であり、有効な型でなければなりません。 C++ データ・タイプ。
- 配列名: array-Name は、アレイに割り当てられる名前です。
- 配列サイズ: array-Size は、配列に格納される要素の数です。 0 より大きい整数である必要があります。
たとえば、次のように age という名前の配列を作成し、5 人の生徒の年齢を保存できます。
int age[5];
配列 age には、さまざまな生徒の年齢を表す 5 つの整数が格納されます。
配列の初期化
配列の初期化は、要素を配列に割り当て/保存するプロセスです。 初期化は 0 つのステートメントで行うことも、1 つずつ行うこともできます。 配列内の最初の要素はインデックス XNUMX に格納され、最後の要素はインデックス n-XNUMX に格納されることに注意してください。ここで、n は配列内の要素の総数です。
age 配列の場合、最初の要素はインデックス 0 に格納され、最後の要素はインデックス 4 に格納されます。
age 配列を使用して、配列の初期化がどのように行われるかを示してみましょう。
int age[5] = {19, 18, 21, 20, 17};
{ } 内の要素の総数は、[ ] 内に記載された値を超えることはできません。 要素 19 はインデックス 0、18 はインデックス 1、21 はインデックス 2、20 はインデックス 3、17 はインデックス 4 にあります。 [ ] 内で配列に格納する要素の数を指定しない場合、配列は{ } 内に追加された要素を保持できる大きさのみになります。 例えば:
int age[] = {19, 18, 21, 20, 17};
上記のステートメントは、前のステートメントとまったく同じ配列を作成します。 インデックスを使用して XNUMX つの要素を配列に割り当てることもできます。 例えば:
age[3] = 20;
上記のステートメントは、age という名前の配列のインデックス 20 に値 3 を格納します。 つまり、20 が 4 になります。th 配列の要素。
配列の種類
2つのタイプがあります C++ 配列:
- 一次元配列
- 多次元配列
- 配列へのポインタ
XNUMX次元配列
これは、データ項目が 1 次元のみに直線的に配置された配列です。 これは一般に XNUMX 次元配列と呼ばれます。 構文:
datatype array-name[size];
- array-name はアレイの名前です。
- サイズは、配列に格納される項目の数です。
例:
#include <iostream> using namespace std; int main() { int age[5] = { 19, 18, 21, 20, 17 }; for (int x = 0; x < 5; x++) { cout <<age[x]<<"\n"; } }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- プログラムのロジックを追加する main() 関数を呼び出します。
- main() 関数の本体の開始。
- age という名前の配列を宣言して 5 つの整数を格納します。 5 つの整数も初期化されています。
- for ループを使用して整変数 x を作成します。
- for ループの本体の始まり。
- ループ変数 x を使用して配列 age の値を反復処理し、コンソールに出力します。 「\n」は改行文字であり、反復のたびに新しい行に出力されます。
- 本体の端 forループ.
- main() 関数の本体の終わり。
多次元配列
これは、データ項目が配列の配列を形成するように配置された配列です。 多次元配列には任意の次元数を含めることができますが、XNUMX 次元配列と XNUMX 次元配列が一般的です。 構文:
datatype array-name[d1][d2][d3]...[dn];
array-name は、n 次元を持つ配列の名前です。 例えば:
二次元配列
2D 配列は、1D 配列のリストにデータを格納します。これは行と列を持つ行列です。2D 配列を宣言するには、次の構文を使用します。
type array-Name [ x ][ y ];
型は有効である必要があります C++ データ型。2D 配列をテーブルとして見てください。x は行数、y は列数を表します。つまり、2D 配列の各要素は a[x][y] という形式を使用して識別します。x は行数、y は要素が属する列数です。
2D 配列を初期化する方法の例を次に示します。
int a[2][3] = { {0, 2, 1} , /* row at index 0 */ {4, 3, 7} , /* row at index 1 */ };
上の例では、2×2 行列として表示される 3D 配列があります。 2行3列あります。 要素 0 は、行インデックス 0 と列インデックス 1 の交点に位置するため、a[0][1] としてアクセスできます。要素 3 は、インデックス 1 の行とインデックス 2 の列の交差点。
要素の異なる行を区別するために中括弧を追加しただけであることに注意してください。 初期化は次のように行うこともできます。
int a[2][3] = {0, 2, 1, 4, 3, 7}; };
以下 C++ この例では、2D 配列を初期化して走査する方法を示します。
#include <iostream> using namespace std; int main() { // a 2x3 array int a[3][2] = { {0, 2}, {1, 4}, {3, 7} }; // traverse array elements for (int i=0; i<3; i++) for (int j=0; j<2; j++) { cout << "a[" <<i<< "][" <<j<< "]: "; cout << a[i][j] << endl; } return 0; }
出力:
上記のコードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- コードを追加する main() 関数を呼び出します。
- main() 関数の本体の開始。
- コメント。 C++ コンパイラはこれをスキップします。
- 2 行 3 列の 2D 配列を宣言します。 項目も配列に追加されました。
- コメント。 C++ コンパイラはこれをスキップします。
- for a ループを使用して変数 i を作成します。 この変数は、配列の行インデックスを反復処理します。
- for ループを使用して変数 j を作成します。 この変数は、配列の列インデックスを反復処理します。
- ループ本体の開始。
- 変数 i と j の値を、コンソールの角括弧内に出力します。
- 配列 a のインデックス [i][j] に格納されている値を出力します。
- ループ本体の終わり。
- プログラムが正常に実行される場合、main() 関数は整数値を返すはずです。
- main() 関数の本体の終わり。
三次元配列
3D 配列は配列の配列です。 3D 配列内の各要素は、3 つのインデックスのセットによって識別されます。 3D 配列の要素にアクセスするには、XNUMX つの for ループを使用します。 例えば:
#include<iostream> using namespace std; void 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"; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- プログラムのロジックを追加する main() 関数を呼び出します。
- main() 関数の本体の開始。
- サイズ 3x2x3 の an という名前の 2D 配列を宣言します。 配列の値も初期化されています。
- 配列のインデックス [0][1][0] に格納されている項目にアクセスし、コンソールに表示します。
- 配列のインデックス [0][1][1] に格納されている項目にアクセスし、コンソールに表示します。
- main() 関数の本体の終わり。
配列へのポインタ
A ポインタ アドレスを保持する変数です。 ポインタを使用して変数のアドレスを格納する以外に、配列セルのアドレスを格納するためにも使用できます。 配列の名前は常にその最初の要素を指します。 以下の宣言を考えてみましょう。
int age[5];
age は $age[0] へのポインターで、age という名前の配列の最初の要素のアドレスです。次の例を考えてみましょう。
#include <iostream> using namespace std; int main() { int *john; int age[5] = { 19, 18, 21, 20, 17 }; john = age; cout << john << "\n"; cout << *john; }
出力:
上記の出力の最初の値は、コンピューターのメモリ内の配列の最初の要素に割り当てられたアドレスに応じて、異なる値を返す場合があることに注意してください。
コードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- プログラムのロジックを追加する main() 関数を呼び出します。
- main() 関数の本体の開始。
- *john という名前のポインター変数を宣言します。
- age という名前の整数配列を宣言して、5 つの整数を格納します。 整数の値も初期化されています。
- 変数 john に、配列 age の最初のインデックスに格納されている項目のアドレスの値を割り当てます。
- 変数 john の値を出力します。これは、配列 age の最初のインデックスに格納されている項目のアドレスです。
- 配列 age に格納されている最初の値を出力します。
- main() 関数の本体の終わり。
配列名は定数ポインターとして使用でき、その逆も同様です。 これは、*(age + 3) を使用して、配列 age のインデックス 3 に格納されている値にアクセスできることを意味します。 例えば:
#include <iostream> using namespace std; int main() { // an array of 5 elements. int age[5] = { 19, 18, 21, 20, 17 }; int *p; p = age; // output array values cout << "Using pointer: " << endl; for (int x=0; x<5; x++) { cout << "*(p + " << x << ") : "; cout << *(p + x) << endl; } cout << "Using age as address: " << endl; for (int x = 0; x < 5; x++) { cout << "*(age + " << x << ") : "; cout << *(age + x) << endl; } return 0; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- main() 関数を呼び出し、main() 関数の本体を開始します。
- コメント。 C++ コンパイラはこれをスキップします。
- age という名前の配列を宣言して 5 つの整数を格納します。
- 整数ポインタの作成 p.
- p に配列 age の最初の要素のアドレスの値を割り当てます。
- コメント。 C++ コンパイラはこれをスキップします。
- コンソールにテキストを出力します。
- for ループを使用して整数 x を作成します。 { は、for a ループの本体の始まりを示します。
- x の値を他のテキストと組み合わせてコンソールに出力します。
- *(p + x) の値をコンソールに出力します。
- for a ループの本体の終わり。
- コンソールにテキストを出力します。
- for ループを使用して変数 x を作成します。 { は、for ループ本体の始まりを示します。
- 0 から 4 までの x の値を他のテキストと一緒に出力します。
- *(age + x) の値を出力します。
- for ループの本体の終わり。
- プログラムが正常に実行された場合の戻り値。
- main() 関数の本体の終わり。
配列の値へのアクセス
配列の要素には、それぞれのインデックスを使用してアクセスします。アクセスする要素のインデックスは、配列名の直後の角括弧 [ ] 内に追加されます。例:
int john = age[2];
上の例では、ジョンの年齢が age という名前の配列のインデックス 2 に格納されることを示しているだけです。 これはジョンの年齢が 3 歳であることを意味しますrd 配列ageの値。以下は完全な C++ この値にアクセスして出力する方法を示す例:
#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; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
- std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
- コードを追加する main() 関数を呼び出します。
- main() 関数の本体の開始。
- age という名前の配列を宣言して、5 つの整数要素を格納します。
- 配列 age のインデックス 2 に格納されている値にアクセスし、その値を john という名前の変数に格納します。
- 変数 john の値を他のテキストと一緒にコンソールに出力します。
配列の利点 C++
ここでは、Arrayを使用する利点について説明します。 C++:
- 配列要素は簡単に走査できます。
- 配列データの操作が簡単です。
- 配列要素にはランダムにアクセスできます。
- 配列はコードの最適化を容易にします。 したがって、少ないコードで多くの作業を実行できます。
- 配列データを簡単にソートできます。
配列の欠点 C++
- 配列のサイズは固定です。 したがって、初期化後に新しい要素を追加することはできません。
- 要件より多くのメモリを割り当てるとメモリ領域が無駄になり、メモリの割り当てが少ないと問題が発生する可能性があります。
- 配列に格納する要素の数は事前にわかっている必要があります。
まとめ
- 配列は、同じデータ型の要素を格納するデータ構造です。
- 配列要素は順番に格納されます。
- 配列要素は、それぞれのインデックスを使用して示されます。 最初の要素はインデックス 0 にあり、最後の要素はインデックス n-1 にあります。ここで、 は配列要素の総数です。
- 配列の宣言には、配列要素のデータ型と配列に格納される要素の数の定義が含まれます。
- XNUMX 次元配列には要素が順番に格納されます。
- XNUMX 次元配列は、要素を行と列に格納します。
- XNUMX 次元配列は配列の配列です。
- 要素は、インデックスを使用して配列に追加できます。
- 配列要素にはインデックスを使用してアクセスします。
- 多次元配列には複数の次元があります。
- 配列名はその最初の要素を指します。
- 配列のサイズは固定です。つまり、配列の初期化後に新しい要素を配列に追加することはできません。