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で書く |
|
| 管理者情報 | プライバシーポリシー |