【C言語】ポインタの仕組みを完全攻略|配列の操作から関数へのポインタ渡しまで徹底解説

  • 2026.05.29
       
【C言語】ポインタの仕組みを完全攻略|配列の操作から関数へのポインタ渡しまで徹底解説

C言語でプログラミングをする上で重要となる機能の1つに、ポインタがあります。
メモリ操作やデータ管理を柔軟に行うためには欠かせない機能ですが、慣れるまでは扱いが難しく感じやすい機能でもあります。

今回は、ポインタの基礎的な使い方から、配列操作や関数などの実践でも使える知識まで詳しく解説していきたいと思いますので、ぜひ参考にしてみてください。

C言語のポインタとは

ポインタとは、メモリ上のアドレスを格納する変数のことを言います。
通常、変数は対応するメモリに格納された 「値」 を直接扱いますが、ポインタの場合は値ではなく 「メモリのアドレス」 を扱うのが特徴です。

この機能はC言語特有のものであり、使用することでメモリの直接操作や配列の効率的な処理、関数への柔軟な引数渡しなどが可能になります。
また、ポインタを利用して動的にメモリ確保することもできるため、より柔軟なデータ管理を可能とします。

ポインタは、C言語において効率的なデータ操作を行うために必要不可欠な機能です。

C言語のポインタ変数における宣言と基本的な使い方

ポインタを宣言する場合は、通常の変数宣言に * を付けて定義します。
宣言時の型指定は、ポインタが指す先のメモリが扱うデータ型を指定します。

C
int *p;  // int型のメモリのアドレス
char *c;  // char型のメモリのアドレス

アドレスを取得する「&」と実体を指す「*」の役割とは

&(アドレス演算子) を使用すると、変数のメモリアドレスを取得することができます。
また、*(間接参照演算子)を使用することで、ポインタが指すメモリ上の値にアクセス可能です。

C
int x = 10;
int *p = &x;  // xのアドレスを取得してpに格納

printf("xのアドレス: %p\n", p);
printf("xの値: %d\n", *p);
実行結果
xのアドレス: 0xffffec5312cc
xの値: 10

ポインタを介した値の代入とメモリの書き換え手順とは

ポインタを通じて変数の値を書き換える場合は、まずポインタに対象のアドレスを格納し、その後に間接参照演算子を用いて値を代入します。

C
int x = 5;
int *p = &x;

*p = 10; // xの値が10に書き換わる
printf("xの値: %d\n", x);
実行結果
xの値: 10

上記のサンプルコードで実行している手順は、以下の通りです。

1, 変数 x のアドレスをポインタ p に格納
2, *p を通じてアドレス先の値を参照
3, *p = 新しい値 でメモリ上の値を書き換える

配列を使って連続したメモリ領域を操作する手法

配列を扱う際、ポインタの概念を応用して操作することができます。
具体的な方法について見ていきましょう。

配列名が指す先頭アドレスの性質とメモリのデータ構造とは

C言語では、配列はメモリ上に連続して格納されます。
一般的に、配列名は先頭要素(0番目)のメモリアドレスを表すため、ポインタとほぼ同じ扱いが可能です。

C
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // arrは先頭要素のアドレス

printf("先頭要素のアドレス: %p\n", p);
Plaintext
先頭要素のアドレス: 0xffffe58b6c40

ポインタ演算を用いた配列要素への効率的なアクセス方法とは

ポインタは、加算・減算によって特定のメモリの前後に移動できます。
配列の場合、「配列名 + i 」 で i 番目の要素のアドレスを取得可能です。

C
printf("0番目のアドレス: %p\n", p);
printf("1番目のアドレス: %p\n", p + 1);
printf("2番目のアドレス: %p\n", p + 2);
printf("3番目のアドレス: %p\n", p + 3);
printf("4番目のアドレス: %p\n", p + 4);
実行結果
0番目のアドレス: 0xffffc2e16a00
1番目のアドレス: 0xffffc2e16a04
2番目のアドレス: 0xffffc2e16a08
3番目のアドレス: 0xffffc2e16a0c
4番目のアドレス: 0xffffc2e16a10

これにより、配列を効率的にループ処理することができます。

C
int arr[5] = {10, 20, 30, 40, 50};

for(int i = 0; i < 5; i++) {
    printf("%d\n", *(arr + i));  // ポインタを使用して配列要素にアクセス
}
実行結果
10
20
30
40
50

この方法を使用することで、配列の処理をポインタベースで行えるようになるため、コンパイラの最適化などに役立ちます。

関数への引数渡しと処理を共通化する方法

関数へ値を引き渡す際にも、ポインタは密接に関係していきます。
通常の引数の渡し方の違いや活用方法などについて、順に見ていきましょう。

値渡しとポインタ渡しの違いが呼び出し元に与える影響とは

C言語では、関数に引数を渡す際の渡し方として、「値渡し」 と 「ポインタ渡し」 の2通りがあります。

値渡しは、対象の値をコピーして関数に渡す方法です。
通常、引数を渡す際は値渡しで行われるため、関数内で値を書き換えても呼び出し元には影響しません。

C
void addOne(int n) {
    n += 1;
}

int main() {

    int a = 5;

    addOne(a);

    printf("%d\n", a);  // 関数の実行後も値は変わらない
}
実行結果
5

一方、ポインタ渡しは、値のコピーではなくアドレスを引数に渡す方法です。
ポインタを通してメモリを直接操作するため、関数内で値を書き換えると呼び出し元に反映されます。

C
void addOne(int *n) {
    *n += 1;
}

int main() {

    int a = 5;

    addOne(&a);

    printf("%d\n", a);  // 関数を実行すると値が変わる
}
実行結果
6

C言語には、他の言語で使用されている 「参照渡し」 の概念が無いため、代わりにポインタ渡しを使用することで同じような動作を実現することができます。

関数ポインタを用いたコールバック処理の仕組みとは

変数と同じように関数もメモリ上に配置されているため、アドレスを示すポインタ(関数ポインタ)を使用して関数を呼び出したり、関数ポインタを引数として渡すことができます。
これにより、処理の抽象化・共通化が可能となり、条件に応じた処理の切り替えなどを柔軟に扱えます。

C
#include <stdio.h>

int ascending(int a, int b) {
    return a - b;
}

int descending(int a, int b) {
    return b - a;
}

void compare(int x, int y, int (*func)(int, int)) {
    if(func(x, y) > 0) {
        printf("順番を入れ替える\n");
    } else {
        printf("そのまま\n");
    }
}

int main() {
    compare(10, 5, ascending);
    compare(10, 5, descending);

    return 0;
}
実行結果
順番を入れ替える
そのまま

このように、関数ポインタを引数に渡すことにより、異なる処理の関数の切り替えなどを容易に実行できるようになります。
条件に応じた動的な処理変更やコールバック関数の実装など、様々な場面で役に立つ方法です。

まとめ

ポインタは一見難解にも見えますが、メモリの理解と組み合わせることで、C言語での柔軟かつ効率的なプログラミングが可能になります。
特に、配列操作や関数呼び出しの柔軟化には不可欠な機能となるため、しっかりと使い方を理解しておきましょう。

C言語の勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、C言語に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Programmingカテゴリの最新記事