Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のポインタ配列とは?宣言・初期化・アクセス方法を実例付きで解説

ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。

ポインタの特徴

  • メモリ空間を節約できる
  • メモリ位置へ直接アクセスするため、実行速度が速い
  • メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能
  • リンクリストやツリーなどのデータ構造と組み合わせて使用できる

ポインタの宣言と初期化

まず、次のような文を考えてみましょう。

int qty = 179;

このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。

ポインタの宣言

ポインタの宣言は以下のように行います。これは「p」がポインタ変数であり、別の整数型変数のアドレスを保持することを意味します。

int *p;

ポインタの初期化

ポインタ変数の初期化には、アドレス演算子(&)を使用します。

int qty = 175;
int *p;
p = &qty;

これで、ポインタpには変数qtyのアドレスが格納されます。

ポインタ配列とは

ポインタ配列とは、アドレス(ポインタ)の集合のことです。複数のポインタを1つの配列としてまとめて管理できるため、大量のデータを扱う際に便利です。

宣言

ポインタ配列の宣言は、次の形式で行います。

データ型 *ポインタ名[サイズ];

例えば、次のように宣言します。

int *p[5];

これは、5つの整数型要素のアドレスを格納できるポインタ配列を表しています。

初期化

ポインタ配列の初期化にも、アドレス演算子「&」を使用します。

int a[3] = {10, 20, 30};
int *p[3], i;

for (i = 0; i < 3; i++)
    p[i] = &a[i];   /* または p[i] = a + i; */

アクセス

ポインタ配列が指す先の値にアクセスするには、間接参照演算子(*)を使用します。

for (i = 0; i < 3; i++)
    printf("%d", *p[i]);

サンプルプログラム1:整数配列へのポインタ配列

以下は、ポインタ配列を使用した基本的なサンプルプログラムです。

#include <stdio.h>

int main(void) {
    int a[3] = {10, 20, 30};
    int *p[3], i;

    for (i = 0; i < 3; i++)
        p[i] = &a[i];

    printf("配列の要素:\n");
    for (i = 0; i < 3; i++)
        printf("%d\t", *p[i]);

    return 0;
}

実行結果

上記のプログラムを実行すると、次の出力が得られます。

配列の要素: 10 20 30

サンプルプログラム2:文字列へのポインタ配列

次に、文字列へのポインタ配列のプログラム例を紹介します。文字列リテラルの先頭アドレスを配列に格納しています。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *a[5] = {"one", "two", "three", "four", "five"};
    int i;

    printf("文字列の格納場所(アドレス):\n");
    for (i = 0; i < 5; i++)
        printf("%d\n", a[i]);

    return 0;
}

実行結果

上記のプログラムを実行すると、各文字列が格納されているメモリアドレスが出力されます(実行環境によって値は異なります)。

文字列の格納場所:
4210688
4210692
4210696
4210702
4210707

このように、ポインタ配列を活用することで、複数のデータへの参照を効率的に管理できます。特に文字列を扱う場合、2次元配列と比べて必要なメモリだけを柔軟に割り当てられるという大きなメリットがあります。

  1. C言語におけるユニオンとポインタの使い方を徹底解説

    ユニオン(共用体)とは、異なるデータ型を持つ複数の変数が、同一のメモリ領域を共有するための仕組みです。構造体が各メンバーごとに独立したメモリを割り当てるのに対し、ユニオンではすべてのメンバーが同じアドレスを参照するという点が大きな特徴です。 ユニオンの構文 ユニオンを定義するときの基本的な書式は次の通りです。 union タグ名{ データ型 メンバー1; データ型 メンバー2; ---- ---- データ型 メンバーn; }; 実際の記述例を見てみましょう。 union sample{ int a; float b; char

  2. C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説

    ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ