ダブルポインタとは?C言語のポインタのポインタをわかりやすく解説

目次

はじめに

ダブルポインタとは
ポインタを指すポインタ のことです。

C
int **pp;

このように * が2つ付きます。

最初は分かりにくいですが、順番に理解すれば簡単です。

初心者さん

*が2個ある意味が分からないです

エンジニアくん

ポインタを指すポインタだよ

初心者さん

なんでそんなの必要なんですか?

エンジニアくん

関数の中でポインタを書き換えるときとかに使うよ

C言語ポインタ解説シリーズ

本記事は「C言語ポインタ解説シリーズ」の1つです。
C言語のポインタを、組み込み開発の視点も交えて解説します。

C言語ポインタ解説シリーズ一覧はこちら


通常のポインタのおさらい

まず普通のポインタ

C
int a = 10;
int *p = &a;

関係はこうなります

C
a  ←  p

pはaのアドレスを持っています。

基本的なポインタの使い方についてはこちらの記事で解説しています。



ダブルポインタ

C
int a = 10;
int *p = &a;
int **pp = &p;

関係はこうなります

C
a ← p ← pp

つまり

pp → p を指す
p → a を指す

となります。


値のアクセス方法

C
int a = 10;
int *p = &a;
int **pp = &p;

値を取り出す

C
**pp

結果

C
**pp → *p → a → 10

つまり

C
printf("%d", **pp);

で 10 が出ます。


書き換えもできる

C
**pp = 100;

すると

C
a == 100

になります。


なぜダブルポインタが必要?

一番重要な理由はこれです

関数の中でポインタを書き換えるため

関数ポインタについてはこちらの記事で解説しています。



ダブルポインタを使わない場合(失敗例)

C
void func(int *p) {
  int a = 100;
  p = &a;
}

int main() {
  int *p;
  func(p);
}

これではmainのpは変わりません。

なぜなら

関数に渡されるのは
ポインタのコピー だからです。


ダブルポインタを使う場合

C
void func(int **pp) {
  static int a = 100;
  *pp = &a;
}

int main() {
  int *p;
  func(&p);
}

これなら

mainのpが変更されます。

これがダブルポインタの最大の用途です。


mallocでよく使う

ダブルポインタはmallocでもよく使います。

C
void create(int **pp) {
  *pp = malloc(sizeof(int));
}

呼び出し

C
int *p;
create(&p);

こうすると

関数の中でメモリ確保できます。

一方で組み込みではmallocは避けられることが多いです。その理由とは?


文字列配列でも使う

C
char *list[] = {
    "A",
    "B",
    "C"
};

char **p = list;

これは

C
"A"
"B"
"C"

を指すポインタの配列です。

つまり

ダブルポインタになります。

配列とポインタの違いについてはこちらの記事で解説しています。


ダブルポインタの読み方

C
int **pp;

右から読む

pp は
→ int* へのポインタ

つまり

「intへのポインタを指すポインタ」


よくある勘違い

ダブルポインタは二次元配列ではない

違います。

C
int **pp;

は単なる

ポインタのポインタです。

二次元配列は

C
int arr[3][4];

です。

メモリの視点での配列とポインタの違いはこちらの記事で解説しています。


まとめ

ダブルポインタとは

C
int **pp;

ポインタを指すポインタ

主な用途

  • 関数内でポインタ変更
  • mallocでメモリ確保
  • 文字列配列
  • 配列の配列

ポインタ学習におすすめの書籍

新・明解C言語 入門編

ダブルポインタは、C言語の中でも特に混乱しやすい概念です。
「ポインタのポインタ」と言われても、最初はイメージしづらいと思います。

この書籍は、図やサンプルコードを使いながら丁寧に解説されているため、

  • ポインタの基本
  • 配列とポインタの関係
  • アドレスの考え方
  • メモリのイメージ

を段階的に理解できます。

ダブルポインタを理解するには、まず「通常のポインタ」をしっかり理解することが大切です。
基礎から整理したい方におすすめの1冊です。

楽天ブックス
¥2,530 (2026/05/30 10:48時点 | 楽天市場調べ)

この記事が参考になった方へ

C言語ポインタ解説シリーズ一覧はこちらです。

またポインタを含むC言語の基本文法も一覧で整理しています。

エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。

副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


目次