「値渡し」と「参照渡し」

 変数はメモリ上に置かれた箱そのもので、ポインタは箱が置かれた場所(アドレス)が入っているという説明をしてきました。これに関して、値渡し参照渡しというものについて説明したいと思います。プログラミングをしていく上での実践的なテクニックからは遠い話かもしれませんが、「基本情報技術者」などのIT系の試験でも扱われる内容なので、この記事で触れていきます。

 以下のプログラムを作成し、実行してみて下さい。

#include <stdio.h>

void plus1(int x)
{
    x = x + 1;
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    int a;
    
    a = 1;
    plus1(a);
    
    printf("a = %d\n", a);
    
    return 0;
}

 以下のような表示が出ます。

a = 1

 このプログラムとほとんど同じですが、以下のプログラムを作成し、実行してみて下さい。

#include <stdio.h>

void plus1(int *x)
{
    *x = *x + 1;
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    int a;
    
    a = 1;
    plus1(&a);
    
    printf("a = %d\n", a);
    
    return 0;
}

 以下のような表示が出ます。

a = 2

 このふたつのプログラムは、まずplus1という自作関数を作ります。急に自作の関数が出てきて混乱するかもしれませんが、main関数やprintf関数と同じようなものを自分で作ることが出来るという程度に今は覚えておけば構いません。とりあえず今回は、このplus1という関数では、xに入った整数の数値に1を足す処理がある、と認識して下さい。

 ふたつのプログラムで違うのは、plus1関数に渡しているものが変数aそのもの、つまり、変数aの中身の値を渡している(前者)か、変数aのアドレスを渡している(後者)か、ということです。前者ではaの値は変わりませんが、後者ではaの値も1足されてしまっています。

 後者でaの値が変わったのは、plus1関数にアドレスを渡したからです。アドレスを渡したのでxは変数ではなくポインタとして扱い、「xが指しているアドレスの中の数値に1を足す」という処理になりました。よって、同じ場所を見ている変数aの値も1から2になったのです。前者が「値渡し」、後者が「参照渡し」です。その名のとおりで、plus1関数に対して前者は変数aの「値」を、後者は変数aの「(参照する)アドレス」を渡したためにこうなった、ということです。

■スポンサーリンク

このページの先頭へ