C のポインターの配列

C のポインターの配列

C では、ポインター配列は、メモリー位置への参照であるインデックス付きポインター変数の同種のコレクションです。これは通常、C プログラミングで、C プログラム内で同様のデータ型の複数のメモリ位置をポイントしたい場合に使用されます。データを指すポインターを逆参照することで、データにアクセスできます。

構文:

pointer_type *array_name [array_size]; 

ここ、

    pointer_type: ポインターが指しているデータのタイプ。 array_name: ポインターの配列の名前。 array_size: ポインターの配列のサイズ。

注記: 異なる型のポインター宣言の配列における演算子の優先順位と結合性を念頭に置くことが重要です。これは、1 つの変更でまったく異なる意味になるためです。たとえば、*array_name を括弧で囲むと、array_name が配列へのポインターであることを意味します。

例:

C




// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p '> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }>

出力

Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c 

説明:

上の例に示すように、配列の各要素は整数を指すポインターです。これらの整数の値にアクセスするには、最初に配列要素を選択し、次にそれを逆参照して値を取得します。

文字へのポインタの配列

ポインタ配列の主な用途の 1 つは、複数の文字列を文字へのポインタの配列として格納することです。ここで、配列内の各ポインターは、文字列の最初の文字を指す文字ポインターです。

構文:

char *array_name [array_size]; 

その後、これらのポインターに任意の長さの文字列を割り当てることができます。

例:

C




char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }>


文字列を格納するこの方法には、従来の文字列配列の利点があります。次の 2 つの例を考えてみましょう。

例 1:

C




// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are: '> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s '> , str[i]);> > }> > return> 0;> }>

出力

String array Elements are: Geek Geeks Geekfor 

上記のプログラムでは、3 行 10 列の文字列配列を宣言しました。ただし、文字列の配列のサイズが事前に定義されているため、メモリが適切に利用されていないか未使用のままになっている場合、プログラムのスペース消費量が増加します。次に、同じ文字列をポインターの配列に格納してみましょう。

例 2:

C




// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s '> , arr[i]);> > }> > return> 0;> }>

出力

geek Geeks Geeksfor 

ここで、使用される合計メモリは、空の領域を残さずに文字列とポインタを格納するために必要なメモリであるため、無駄な領域を大幅に節約できます。これは、以下に示す画像を使用すると理解できます。

文字列配列のメモリ表現

文字へのポインタの配列が占めるスペースは、ポインタの格納に必要なメモリを除いて実線の緑色のブロックで示され、文字列の配列が占めるスペースには実線と薄緑色のブロックの両方が含まれます。

異なる型へのポインタの配列

int、char、float などの基本データ型のポインターの配列を定義できるだけでなく、配列や構造体などの派生データ型やユーザー定義のデータ型に対しても定義できます。以下の例を考えてみましょう。さまざまな操作を実行するための関数を指すポインターの配列を作成します。

例:

C




// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d '> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d '> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d '> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }>

出力

Sum : 55 Difference : 45 Product : 250 Quotient : 10 

ポインタ配列の適用

ポインターの配列は、さまざまな場合に役立ちます。これらのアプリケーションの一部を以下に示します。

  • 複数の文字列を格納するために最も一般的に使用されます。
  • これは、C で LinkedHashMap を実装する場合や、ハッシュで衝突を解決するチェーン技術でも使用されます。
  • バケットソートなどのソートアルゴリズムで使用されます。
  • これは任意のポインター型で使用できるため、複数のエンティティを個別に宣言し、それらを 1 つの場所に保存したい場合に便利です。

ポインタ配列の欠点

ポインターの配列には相応の欠点もあるので、利点が欠点を上回る場合に使用する必要があります。ポインタの配列には次のような欠点があります。

    メモリ消費量の増加: ポインタの配列は、ポインタを格納するために追加のスペースが必要となるため、単純な配列と比較してより多くのメモリを必要とします。複雑さ: ポインターの配列は、単純な配列に比べて使用が複雑になる可能性があります。バグが発生しやすい: ポインターを使用すると、ポインターに関連するすべてのバグが伴うため、慎重に扱う必要があります。

関連記事: 配列へのポインタ |配列ポインタ