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

【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法

ポインタとは?

ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。

例えば、次のような変数宣言を見てみましょう。

int qty = 179;

【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法

この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。

ポインタの宣言

ポインタを宣言する構文は以下の通りです。

int *p;

ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。

ポインタの初期化

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

次の例を見てください。

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

このコードでは、変数 qty のアドレスがポインタ p に代入されます。これにより、p を通じて qty の値に間接的にアクセスできるようになります。

ポインタ配列とは

ポインタ配列とは、複数のアドレス(=複数のポインタ)をまとめて管理するための配列のことです。

宣言方法

ポインタ配列は次のように宣言します。

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

具体例:

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; でも同じ */

なお、p[i] = a + i; としても同じ意味になります。これは、配列名 a が先頭要素のアドレスを指すというC言語の性質を利用した書き方です。

要素へのアクセス

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

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

このループにより、配列 a の全要素(10、20、30)が出力されます。

配列要素の合計を計算するプログラム

それでは、ポインタを使用して配列要素の合計を計算するCプログラムを見ていきましょう。このプログラムでは、動的メモリ確保関数 malloc() を使って、ユーザーが指定したサイズの配列を生成しています。

/* ポインタを使った配列要素の合計計算 */
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int i, n, sum = 0;
    int *ptr;

    printf("配列のサイズを入力してください:\n");
    scanf("%d", &n);

    /* 整数n個分のメモリを動的に確保 */
    ptr = (int *) malloc(n * sizeof(int));

    printf("要素を入力してください\n");
    for (i = 0; i < n; i++){
        scanf("%d", ptr + i);        /* ptr+i は ptr[i] のアドレス */
    }

    /* 各要素の合計を計算 */
    for (i = 0; i < n; i++){
        sum = sum + *(ptr + i);      /* *(ptr+i) は ptr[i] の値 */
    }

    printf("配列内の全要素の合計 = %d\n", sum);
    return 0;
}

プログラムのポイント

  • ptr + i:ポインタ ptr が指す位置から i 個先の要素のアドレスを表します。
  • *(ptr + i):そのアドレスに格納されているを取り出します(ptr[i] と同等)。
  • malloc(n * sizeof(int)):整数 n 個分の連続したメモリ領域を実行時に確保します。

実行結果

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

配列のサイズを入力してください:
5
要素を入力してください
12
13
14
15
16
配列内の全要素の合計 = 70

入力された 12 + 13 + 14 + 15 + 16 の合計である 70 が正しく表示されました。このように、ポインタ演算を活用することで、添字(インデックス)を使わずに配列の各要素へ柔軟にアクセスし、合計を求めることができます。

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

    ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる メモリ位置へ直接アクセスするため、実行速度が速い メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能 リンクリストやツリーなどのデータ構造と組み合わせて使用できる ポインタの宣言と初期化 まず、次のような文を考えてみましょう。 int qty = 179; このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。 ポインタの宣言 ポ

  2. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ