C言語 入門 自作関数のアドレス渡し(ポインタを使う!)

C言語

アドレス渡しを使う関数を勉強したい。

ポインタを関数で使うには?

値渡しを使うとき、ポインタ渡しを使うとき何が違う?

この記事を読めば、これらの悩みを解決できます。

今回も、変数に代入された値を2倍して出力するプログラムを使って解説します。

アドレス渡しを関数に応用すれば、その自作関数で計算した値をその後のプログラムに反映することができます。

つまり、自作関数の後で、2倍した変数を出力したりできるようになります。この話が分からない人は、先に「自作関数の値渡し」を勉強してみましょう。

また、アドレス渡しをまだ勉強していない人は、下の記事を参考にしてみてください。

スポンサーリンク

アドレス渡しを使った自作関数とは?

自作関数の主な構造は

・プロトタイプ宣言

・main関数(この中に自作関数)

・自作関数の説明

です。上から順に解説していきます。

プロトタイプ宣言

void nibai(int *pa);

プロトタイプ宣言はこのように書きます。

戻り値がない関数を作るので、データ型に「void」を使います。

また、アドレス渡しをするため、カッコの中にはポインタを使っています

main関数

int main()
{
	int a;
	a = 5;

	nibai(&a);

	printf("%d", a);
}

変数「a」に5を代入していて、これを自作関数「nibai」で2倍するといった感じです。

引数の部分に「&a」(変数aのアドレス)が入っていて、こうすることで「自作関数の説明」に「a」のアドレスを送ることができます。このように、アドレス渡しは、必ず自作関数のカッコの中にアドレスを入れます。

自作関数の説明

void nibai(int *pa)
{
	*pa *= 2;
}

「自作関数」の引数と「自作関数の説明」のカッコの中が一致していないのは、送られてきたaのアドレスを*paに送るためです。ここで、アドレス渡しの考え方を使っています。(ポインタのアドレス「pa」を入れたくなりますが、データ型の後ろにアドレスを書くことはできないため「*pa」のままにしています。この話がよく分からない人は、下の記事を参考にしてみてください。)

結果的に、自作関数うから送られてきた「a」のアドレスは、「*pa」のアドレスに代入されます

つまり、「a」のアドレスと「*pa」のアドレスが同じなので、「*pa」を2倍したら、「a」を2倍することができます。

もう一度「main関数」を見てもらえれば分かりますが、こうして変数は自作関数で2倍され、出力されます。

ここまでをまとめます。

#include<stdio.h>
void nibai(int *pa);
int main()
{
    int a;
    a = 5;

    nibai(&a);

    printf("%d", a);
}

void nibai(int *pa)
{
    *pa *= 2;
}

では、出力してみます。

5を2倍して、「10」が出力されました。

まとめ:自作関数のアドレス渡し

初心者の方は特に、「自作関数」と「自作関数の説明」のカッコの中身が一致してないところは、難しいと思います。

分からなかったら、過去に勉強したものを復習しましょう。

悩みすぎるのはよくないので、どうしても分からなかったら先に進めましょう。

次は、ポインタと配列と関数の応用です。