ポインタ渡し | Programming Place Plus 用語集

トップページ用語集

名称 🔗

解説 🔗

C言語C++ のようなポインタ型を持つプログラミング言語において、関数呼び出し先に、ポインタ型の引数を渡す方法のことです。

#include <stdio.h>

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(void)
{
    int x = 5;
    int y = 10;

    swap(&x, &y);  // ポインタとして渡す
    printf("x = %d, y = %d\n", x, y);
}

実行結果:

x = 10, y = 5

呼び出し元の変数メモリアドレスをポインタ渡しすることによって、呼び出し先の関数がその変数を直接操作できます。これにより、関数内でポインタが指し示す先にあるを変更すると、呼び出し元の変数の値を変更できます。

このような、1つのオブジェクトを、関数の呼び出し元と呼び出し先とで同一視して扱う操作は、実引数仮引数がまったく同じ実体を参照するように渡す参照渡しが可能であれば、直接的に実現できます。しかし、C言語では参照渡しを行う方法がないため、その代替策としてポインタ渡しが利用できます。C++ では参照型の引数を用いる方法で参照渡しが可能です。

実際には、ポインタ渡しは、参照先を表現する値(メモリアドレス)のコピーを渡しているため、参照渡しではなく値渡しであるといえます(そのため、参照の値渡しと呼ぶこともあります)。ポインタ渡しが値渡しの一種であることは、仮引数のポインタの値を変更しても、呼び出し元の変数の値が変更されないことからもわかります。

#include <stdio.h>

int a = 10;
int b = 20;

void f(int* p)
{
    p = &b;  // 仮引数の値を変更する
}

int main(void)
{
    int* p = &a;
    printf("%d (%p)\n", *p, p);

    f(p);  // ポインタ渡し
    printf("%d (%p)\n", *p, p);
}

実行結果:

10 (00007FF790DAC000)
10 (00007FF790DAC000)


参考リンク 🔗

更新履歴 🔗


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Facebook でシェア X で ポストフォロー
LINE で送る noteで書く rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー
先頭へ戻る