C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
ブルポインタとは
ポインタを指すポインタ のことです。
int **pp;このように * が2つ付きます。
最初は分かりにくいですが、順番に理解すれば簡単です。
初心者さん*が2個ある意味が分からないです



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



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



関数の中でポインタを書き換えるときとかに使うよ
通常のポインタのおさらい
まず普通のポインタ
int a = 10;
int *p = &a;関係はこうなります
a ← ppはaのアドレスを持っています。
基本的なポインタの使い方についてはこちらの記事で解説しています。
ダブルポインタ
int a = 10;
int *p = &a;
int **pp = &p;関係はこうなります
a ← p ← ppつまり
pp → p を指す
p → a を指す
となります。
値のアクセス方法
int a = 10;
int *p = &a;
int **pp = &p;値を取り出す
**pp結果
**pp → *p → a → 10つまり
printf("%d", **pp);で 10 が出ます。
書き換えもできる
**pp = 100;すると
a == 100になります。
なぜダブルポインタが必要?
一番重要な理由はこれです
関数の中でポインタを書き換えるため
ダブルポインタを使わない場合(失敗例)
void func(int *p) {
int a = 100;
p = &a;
}
int main() {
int *p;
func(p);
}これではmainのpは変わりません。
なぜなら
関数に渡されるのは
ポインタのコピー だからです。
ダブルポインタを使う場合
void func(int **pp) {
static int a = 100;
*pp = &a;
}
int main() {
int *p;
func(&p);
}これなら
mainのpが変更されます。
これがダブルポインタの最大の用途です。
mallocでよく使う
ダブルポインタはmallocでもよく使います。
void create(int **pp) {
*pp = malloc(sizeof(int));
}呼び出し
int *p;
create(&p);こうすると
関数の中でメモリ確保できます。
一方で組み込みではmallocは避けられることが多いです。その理由とは?
文字列配列でも使う
char *list[] = {
"A",
"B",
"C"
};
char **p = list;これは
"A"
"B"
"C"を指すポインタの配列です。
つまり
ダブルポインタになります。
ポインタと配列の違いはこちらの記事で詳しく解説しております。
ダブルポインタの読み方
int **pp;右から読む
pp は
→ int* へのポインタ
つまり
「intへのポインタを指すポインタ」
よくある勘違い
ダブルポインタは二次元配列ではない
違います。
int **pp;は単なる
ポインタのポインタです。
二次元配列は
int arr[3][4];です。
メモリの視点での配列とポインタの違いはこちらの記事で解説しています。
まとめ
ダブルポインタとは
int **pp;ポインタを指すポインタ
主な用途
- 関数内でポインタ変更
- mallocでメモリ確保
- 文字列配列
- 配列の配列
この記事が参考になった方へ
C言語の基本文法を一覧で整理しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント