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

目次

C言語文法解説シリーズ

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

👉 C言語文法解説シリーズ一覧はこちら

ブルポインタとは

ポインタを指すポインタ のことです。

C
int **pp;

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

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

初心者さん

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

エンジニアくん

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

初心者さん

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

エンジニアくん

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


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

まず普通のポインタ

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言語文法解説シリーズ一覧はこちら

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

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

お問い合わせはこちら

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

この記事を書いた人

コメント

コメントする


目次