Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のダブルポインタ(ポインタへのポインタ)とは?宣言・初期化・アクセス方法をサンプルコードで解説

C言語におけるポインタへのポインタ(ダブルポインタ)とは、別のポインタのアドレスを格納する変数のことです。通常のポインタが変数のアドレスを保持するのに対し、ダブルポインタは「ポインタ変数そのもののアドレス」を保持するという、一段階深い間接参照を実現します。

ダブルポインタの宣言方法

ポインタへのポインタは、アスタリスク(*)を2つ付けて宣言します。

datatype **pointer_name;

具体的な例を見てみましょう。

int **p;

この場合、pは「int型へのポインタ」を指すポインタ、つまりダブルポインタとなります。

ダブルポインタの初期化

初期化にはアドレス演算子「&」を使用します。以下の例では、変数aのアドレスをポインタpに、さらにポインタpのアドレスをダブルポインタqに格納しています。

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

値へのアクセス方法

ダブルポインタが指す先の値にアクセスするには、間接参照演算子(*)を2回重ねた「**」を使用します。

  • *p … ポインタpが指す変数aの値(1段階の間接参照)
  • **q … ダブルポインタqが指すポインタpを経由して取得したaの値(2段階の間接参照)

サンプルプログラム1:基本的なダブルポインタ

以下は、ダブルポインタの基本的な動作を確認するCプログラムです。

#include <stdio.h>

int main(void) {
    int a = 10;
    int *p;
    int **q;

    p = &a;
    q = &p;

    printf("a = %d\n", a);
    printf("ポインタ経由で取得したaの値 = %d\n", *p);
    printf("ダブルポインタ経由で取得したaの値 = %d\n", **q);

    return 0;
}

実行結果

a = 10
ポインタ経由で取得したaの値 = 10
ダブルポインタ経由で取得したaの値 = 10

変数aに直接アクセスした場合、ポインタpを経由した場合、ダブルポインタqを経由した場合、いずれも同じ値「10」が取得できることがわかります。

サンプルプログラム2:ポインタとダブルポインタの関係を表示

次に、各変数の値とアドレスを表示することで、ポインタとダブルポインタの関係を詳しく確認するプログラムを紹介します。

#include <stdio.h>

int main(void) {
    // 変数とポインタの宣言
    int a = 10;
    int *p;
    p = &a;
    int **q;
    q = &p;

    // 結果の出力
    printf("aの値: %d\n", a);                          // 10
    printf("aのアドレス(pの値): %d\n", p);            // aのアドレス
    printf("pが指す先の値(*p): %d\n", *p);           // 10
    printf("pのアドレス(qの値): %d\n", q);            // pのアドレス
    printf("qが指す先の値(*q): %d\n", *q);           // aのアドレス
    printf("**qの値: %d\n", **q);                      // 10

    return 0;
}

実行結果

aの値: 10
aのアドレス(pの値): 6422036
pが指す先の値(*p): 10
pのアドレス(qの値): 6422024
qが指す先の値(*q): 6422036
**qの値: 10

実行結果からわかること

この実行結果から、以下の関係性が読み取れます。

  • ポインタpには変数aのアドレス(6422036)が格納されている
  • ダブルポインタqにはポインタpのアドレス(6422024)が格納されている
  • *q を参照すると a のアドレス(6422036)が得られ、**q を参照すると a の値(10)が得られる

※アドレスの値は実行環境やコンパイラによって異なります。また、アドレスを表示する際は、移植性を考慮すると「%d」ではなく「%p」を使用することが推奨されます。

このように、ダブルポインタは2段階の間接参照によって値にアクセスする仕組みであり、2次元配列の動的確保や、関数内でポインタ自体を書き換えたい場合などに活用されます。

  1. 【C言語】forループを使って1〜Nまでの素数をすべて表示するプログラム

    問題 実行時にユーザーが入力した値nに対して、1からnの間に存在するすべての素数を表示するC言語プログラムを作成しましょう。 解決策 ここでは、forループを使用して、実行時にユーザーから与えられた値nまでの範囲内にある素数をすべて検出・表示する方法を解説します。なお、素数とは、1とその数自身以外に約数を持たない、1より大きい自然数のことです。具体的には、2、3、5、7、11、13などが該当します。 アルゴリズム 以下は、実行時にユーザーが入力した値nまでの素数をすべて表示するためのアルゴリズムです。 ステップ1 − nの値を入力として読み込む ステップ2 − カウンタ変数countを0で初

  2. C++で3次元空間における2つの平面間の角度を計算する方法

    本記事では、3次元空間内にある2つの平面 P1 と P2 の間の角度を求める方法を解説します。平面の方程式と角度の公式平面 Pi の方程式は、一般に次の形式で表されます。a・x + b・y + c・z + d = 0ここで、係数 (a, b, c) は平面の法線ベクトルを表しています。2つの平面がなす角度を「A」とすると、それぞれの法線ベクトルのなす角として、次の式で求められます。cos A = (a₁a₂ + b₁b₂ + c₁c₂) / (√(a₁² + b₁² + c₁²) × √(a₂² + b₂² + c₂²))つまり、分子は2つの法線ベクトルの内積、分母はそれぞれの法線ベクトルの大