C言語ポインタ制御の徹底解説ブログ

C言語でプログラミングを始めると、必ず登場するのが「ポインタ」です。ポインタはC言語の強力な特徴であり、メモリ操作や効率的なプログラム作成に欠かせません。しかし、その概念や使い方に苦手意識を持つ方も多いでしょう。この記事では、ポインタの基礎から制御方法、応用例までを図解・サンプルコード付きで丁寧に解説します。

ポインタとは?

**ポインタとは、「変数のアドレス(メモリ上の位置)を格納する変数」**です。
通常の変数は値そのものを保持しますが、ポインタは「どこに値があるか」を記憶します。

int x = 10;
int *p;
p = &x; // xのアドレスをpに代入

このとき、pは「xが保存されているメモリの番地」を記憶します。
*pと書くことで、そのアドレスに格納された値(この場合は10)を参照できます。

ポインタの簡単なイメージは↓のような感じです。

ポインタの宣言と基本操作

宣言方法

  • *型名 変数名;
    例:int *ptr;(int型の値を指すポインタ)

アドレスの取得

  • &演算子で変数のアドレスを取得
ptr = &x; /* xのアドレスをptrに代入 */

間接参照(値の取得・書き換え)

  • *演算子でアドレス先の値を参照・変更
*ptr = 20; // xの値が20に書き換わる

配列とポインタの関係

C言語では配列名は配列の先頭要素のアドレスとして扱われます。

int arr[] = {1, 2, 3};
int *p = arr; // arrはarr[0]のアドレス
printf("%d\n", *p);     // 1
printf("%d\n", *(p+1)); // 2

    arr[k]*(arr + k)と同じ意味です。

    ポインタの演算

    ポインタには加算・減算が可能です。
    p++で「次の要素のアドレス」へ移動します(型に応じたサイズ分アドレスが進む)。

    int arr[] = {10, 20, 30};
    int *p = arr;
    printf("%d\n", *p); // 10
    p++;
    printf("%d\n", *p); // 20

    関数とポインタ(参照渡し)

    C言語の関数は値渡しが基本ですが、ポインタを使うことで参照渡しが可能です。
    これにより、関数内で変数の値を直接変更できます。

    void updateValue(int *p) {
        *p = 100;
    }
    
    int main() {
        int num = 50;
        updateValue(&num);
        printf("%d\n", num); // 100
        return 0;
    }

    このように、関数に変数のアドレスを渡すことで、呼び出し元の値を直接操作できます。

    応用:関数ポインタ

    関数のアドレスもポインタで扱うことができます。
    これにより、関数を引数として渡したり、動的に処理を切り替えたりできます。

    int add(int a, int b) { return a + b; }
    int (*func_ptr)(int, int) = add;
    int result = func_ptr(2, 3); // 5

    ポインタ制御の注意点

    • 未初期化ポインタの利用は危険(ダングリングポインタやセグメンテーションフォルトの原因)
    • NULLポインタの活用(初期化時やエラー判定に利用)
    • **多重ポインタ(二重ポインタ)**はポインタ配列や動的メモリ管理でよく使われる

    まとめ

    • ポインタは変数のアドレスを格納する変数
    • 配列・関数・構造体などと組み合わせて使うことで、C言語の表現力が飛躍的に向上
    • 参照渡し・ポインタ演算・関数ポインタなどを活用し、効率的なプログラミングを実現

    C言語を扱うのには、このポインタの仕組みを理解しておくことがマストになります。
    メモリ空間にどのように変数等が配置されるのか正しく理解してC言語マスターになりましょう!!

    にいやん

    出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村