配列とポインターの違い
コンテンツ
配列とポインターの間には密接な関係があります。ポインタを使用して配列要素にアクセスし、ポインタ演算を使用して配列全体にアクセスすると、アクセスが高速になります。ポインターと配列には基本的な違いがあります。つまり、配列は類似したデータ型の変数のコレクションであるのに対し、ポインターは別の変数のアドレスを格納する変数です。配列とポインターには他にもいくつかの違いがありますが、それらについては比較チャートで後述します。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | アレイ | ポインタ |
---|---|---|
宣言 | // C ++で タイプvar_name; // Javaで。 タイプvar-name; var_name =新しいタイプ。 | // C ++で タイプ* var_name; |
ワーキング | 同種のデータ型の変数の値を格納します。 | ポインター変数データ型と同じデータ型の別の変数のアドレスを保存します。 |
世代 | ポインターの配列を生成できます。 | 配列へのポインターを生成できます。 |
Javaサポート | 配列の概念をサポートします。 | ポインターをサポートしていません。 |
ストレージ | 通常の配列には変数の値が格納され、ポインター配列には変数のアドレスが格納されます。 | ポインターは、変数のアドレスを格納するために特別に設計されています。 |
容量 | 配列には、配列変数のサイズに記載されている要素の数を格納できます。 | ポインター変数は、一度に1つの変数のアドレスのみを保存できます。 |
配列の定義
配列は同じデータ型の要素のコレクションであり、これらのすべての要素は共通名(配列変数の名前)によって参照されます。特定の配列要素には、その要素が格納されている配列の特定のインデックスにアクセスすることでアクセスできます。配列には、1次元配列、2次元配列、または多次元配列を指定できます。ポインターの配列、つまりすべての変数をポインター変数として含む配列も生成できます。 「C ++」では配列は静的に割り当てられますが、「Java」では配列は動的に割り当てられます。
// C ++では、var_nameと入力します。 // Javaで。タイプvar-name; var_name =新しいタイプ。
ここで、「タイプ」は配列変数のデータ型を示し、「var_name」は配列変数に与えられた名前を示し、「サイズ」は配列変数の容量を示します。つまり、その配列変数に「タイプ」の要素をいくつ格納できるかを示します。配列にアクセスするには、最初の「ポインター演算」と2番目の「配列インデックス」の2つの方法があり、そのうち「ポインター演算」の方が高速です。
//ポインター演算を使用したアクセスVoid display_array(int * S){while(* s){cout(<< "value is" << * s); * s ++; }}
「配列演算」、つまりそのインデックスを使用して配列変数にアクセスする場合と比較して、「ポインター演算」を使用するとより高速に動作します。ポインターの配列を関数に渡す必要がある場合は、通常の配列を渡すために使用するのと同じメソッドを使用して、つまり、インデックスなしで配列の名前で関数を直接呼び出すことで実行できます。
例でそれを理解しましょう
//ポインターの配列を宣言します。 int * p;
ここでは、「p」は整数型の配列であり、整数型の10個の変数のアドレスを保持することを示しています。上記のポインター配列を関数display()に渡します。
display(p); //関数表示を呼び出します。 void display(int * d){//ポインタ配列を受け取る関数。 for(int i = 0; i <10; i ++){cout <<( "index" <
この関数は、変数に存在する値を表示し、そのアドレスはこのポインター配列に順番に保存されます。
ポインターの定義
ポインタは、別の変数のメモリアドレスを保持する変数です。ポインター変数と、アドレスがポインター変数に割り当てられる変数の両方のデータ型は同じでなければなりません。ポインター変数は、次のように宣言されています。
// C ++ type * nameでの宣言;
ここで、「タイプ」はデータタイプ、「名前」はポインター変数の名前です。 「タイプ」は、ポインター変数に格納できる変数の種類を定義します。たとえば、整数ポインタは整数変数のアドレスを格納します。 2つのポインター演算子「*」と「&」があります。演算子「*」は、アドレスにある値を返します。この値は、変数に格納され、その後に「*」記号が続きます。 「&」演算子は、変数のアドレスに続いて「&」記号を返します。
//たとえば、int b = 10 int a =&b; //ここで、bのアドレスは変数aに保存されます。 // bのアドレスは2000なので、a = 2000になります。 int c = * a; //ここで、整数ポインタ変数* aは、.ieに格納されているアドレスにある値を返します。 c = 10。
ポインターで使用できる算術演算子は2つだけです(加算と減算)。整数ポインター変数に増分を適用する場合、整数ポインターであるため、データ型のサイズ分、つまり2バイトずつ増分されます。増分時には、次の整数変数を指す必要があります。デクリメントの場合も同様です。
// pは値2000を含む整数ポインタです。p++; // p = 2002になりました。 p--; // pには、2バイトずつ減少した2000が再び含まれます。
- 配列には類似のデータ型の変数が格納され、変数のデータ型は配列の型と一致する必要があります。一方、ポインター変数には、ポインター変数の型に類似した型の変数のアドレスが格納されます。
- ポインターの配列、つまり変数がポインター変数である配列を生成できます。一方、配列を指すポインターを作成できます。
- Javaは配列をサポートしていますが、ポインターはサポートしていません。
- 配列サイズは、格納できる変数の数を決定しますが、ポインター変数は変数のみのアドレスを格納できます
注意:
Javaは、ポインターをサポートしないか、厳密に回避しません。
結論:
同様のデータ型のデータ要素で作業する必要がある場合、変数を個別に処理する代わりに、同様のデータ型の変数の配列を作成して操作できます。一部のプログラムにはポインターが必要であり、非常に強力ですが、残念ながら、ポインターに誤った値が含まれている場合、見つけるのが最も難しいバグになります。