C言語

【C言語】第4章第14回:ポインタ演算の応用

ポインタ演算は、メモリ操作やデータ管理の効率を高める重要な技術です。この章では、ポインタ演算の基礎から応用までを段階的に解説し、実用的なスキルを習得します。

1. ポインタ演算の基本

1.1 ポインタの加算と減算

ポインタ演算では、ポインタを加減算することで配列の要素を操作できます。

例:ポインタの加算を使った配列の操作

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *ptr = arr; // 配列の先頭を指すポインタ

    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d\n", i, *(ptr + i)); // ポインタの加算を利用
    }

    return 0;
}

コードの解説:

  • int *ptr = arr;:配列arrの先頭要素を指します。
  • *(ptr + i):ポインタの加算により、配列の各要素にアクセスします。

1.2 ポインタの比較

ポインタは比較することも可能です。同じ配列内のポインタ同士を比較して範囲をチェックできます。

例:ポインタを使った範囲チェック

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *start = arr;         // 配列の先頭
    int *end = arr + 4;       // 配列の最後の要素

    for (int *ptr = start; ptr <= end; ptr++) {
        printf("Value: %d\n", *ptr);
    }

    return 0;
}

コードの解説:

  • int *start = arr;:配列の先頭を指すポインタ。
  • int *end = arr + 4;:配列の最後の要素を指します。
  • ptr <= end:ループ内でポインタを比較し、範囲内での操作を保証します。

2. ポインタ演算を活用した応用例

2.1 配列の逆順表示

ポインタ演算を使うと、配列を効率的に逆順に表示できます。

例:配列を逆順に表示

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *start = arr;         // 配列の先頭
    int *end = arr + 4;       // 配列の最後

    while (end >= start) {
        printf("%d ", *end);  // 現在のポインタが指す値を出力
        end--;                // ポインタをデクリメント
    }
    printf("\n");

    return 0;
}

コードの解説:

  • end--;:ポインタをデクリメントして逆順に操作します。
  • ループ条件としてend >= startを指定し、範囲内で操作を実行します。

2.2 二次元配列の操作

二次元配列もポインタ演算を使って操作できます。

例:二次元配列のポインタ演算

#include <stdio.h>

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*ptr)[3] = matrix; // 配列の行を指すポインタ

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", *(*(ptr + i) + j));
        }
        printf("\n");
    }

    return 0;
}

コードの解説:

  • int (*ptr)[3] = matrix;:行単位で配列を指します。
  • *(*(ptr + i) + j):行ポインタに加算し、列を参照します。

3. 練習問題

以下の課題に挑戦して、ポインタ演算のスキルを深めましょう。

  1. ポインタ演算を使って、配列の最大値と最小値を求めるプログラムを作成してください。
  2. ポインタ演算を使って、二次元配列の要素をすべて2倍にするプログラムを作成してください。
  3. ポインタ演算を使って、文字列を逆順に表示するプログラムを作成してください。

4. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int arr[] = {5, 10, 15, 2, 20};
    int *ptr = arr;
    int max = *ptr, min = *ptr;

    for (int i = 0; i < 5; i++) {
        if (*(ptr + i) > max) max = *(ptr + i);
        if (*(ptr + i) < min) min = *(ptr + i);
    }

    printf("Max: %d, Min: %d\n", max, min);

    return 0;
}

解説:

  • ポインタを使用して各要素を比較し、最大値と最小値を更新します。

5. まとめ

ポインタ演算は、C言語プログラミングにおける強力な機能です。今回学んだ知識を応用し、効率的なコードを書く練習をしましょう。