C言語 ポインタ変数(2) ポインタを関数に渡す

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

前回に引き続き、関数の作成。関数との値のやりとりについては、次の2パターンがあるらしい。

  • 値渡し:引数に変数が渡される。変数自体は変化しない。
  • ポインタ渡し:関数に変数の値を変えて欲しいときに使用。引数が配列のときはポインタ渡しを使う必要がある

ポインタ変数を関数(Aとする)の引数に使用することによって、他の関数(Bとする)からのAへのアクセス時に(Aに代入した)変数を変化させることが出来る。ということか。

そもそもポインタ変数とは、(物理的な)メモリの場所(を割り当てる箱のようなもの?)を意味しており、それを関数の引数に用いるということは、該当するメモリの場所にある変数に対して関数の処理を実行することを意味する、という理解。

 

以下、学習用に書いてみた。

#include <stdio.h>
#include <stdlib.h>

void decrease(int *p) {
        (*p)--;
}

main()
{
        char num[100] ;
        int kazu;

        gets(num);
        kazu = atoi(num);
        decrease(&kazu);
        printf("kazu=%d\n", kazu);
}

 decrease関数の引数をポインタ変数 *pとすることで、*pにはメモリの特定領域のアドレス(を割り当てることの出来る箱)が割り当てられる。

main部分で&kazuとすることにより、変数kazuの格納場所を*pに割り当てる。

decrease関数は、*pに割り当てられた格納場所にある変数(つまりkazu)対して処理(1を引く)を実行する。

という理解。 

 【追記】

ポインタ変数は、メモリの住所を教えてくれるのを待っている。

変数の住所(上の例だと&kazu)を、関数の引数に用いられているポインタ変数に教えてあげると、教えた住所にある変数(kazu)に対して、関数の処理を実行する。

と考えれば良いのだろう。