【問題14】ポインタなしで関数は語れない:完全マスター! 組み込みC言語プログラミング(15)(2/2 ページ)
C言語においてポインタは「何か(オブジェクト)を指すもの」ですが、単純に何かを指すだけではなく、関数内のオブジェクトを参照することもできます。ポインタなしに関数は語れないという実例を確認してみましょう。
関数の引数にポインタを渡すこととは
それでは、chcnt.cの解説しながら、&を用いた引数から値を受け取るしくみ解き明かし
ましょう。
4行目の
void char_count(const char *str, int *alps, int *digs);
が自作関数char_countのプロトタイプ宣言です。
最初のvoidは、char_countは返す値がないことを意味します。
1つ目の引数の型は、charへのポインタです。ここで配列とポインタを同等に扱えることは、前回解説しました。「配列のように大きいデータを関数に渡すとき」にはポインタが使われます。
さらに続く2つの引数の型は、intへのポインタです。この場面は、「関数の引数から値(結果)を受け取りたいとき」で、ここでもポインタを使います。
次に関数呼び出しです。13行目の
char_count(str, &a, &d);
で、char_countが呼び出され、制御がchar_countに移ります。
ここでの1つ目の引数はstrで、これは「配列の先頭ポインタ」です。
続く2つの引数では、変数の前に & が付いています。この&は「アドレス演算子」と呼ばれるもので、オブジェクトへのポインタを求めるものです。ですから、&aは「変数aへのポインタ」、&bは「変数bへのポインタ」です。実はchar_countには引数が3つありますが、3つとも「ポインタ値」を渡しているのです。
さらに、18行目から31行目では、char_countが関数定義されています。18行目の
void char_count(const char *str, int *alps, int *digs)
では、文字列はstrが、英字の文字数はalpsが、数字の文字数はdigsが対応しますが、ここでポインタの機能が重要なカギを握ります。ポインタは「何か(オブジェクト)を指すもの」でした。ですからポインタを引数に渡すことで、下図のように、char_countの中からmainの中のオブジェクトを参照できるのです。
まとめると、「関数に対して変数の値を変更させるには、引数にその変数へのポインタ
を渡す」のです。呼ばれた関数からは、29行目と30行目のように、
*alps = acnt; *digs = dcnt;
間接演算子(*)を使って、ポインタの指すオブジェクトに値を代入するのです。
char_countで英字と数字の文字数のカウントは、23行目から28行目で行っています。これについては、問題11(文字列の長さと文字種類の判別)の解説を参考にしてください。
問題15
それでは、次回の宿題です。
問題15:
基数変換する関数を作ってください。引数には基数変換する整数と基数、基数変換された結果を受け取る文字列の3つを使います。
⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 完全マスター! 組み込みC言語プログラミング(14):【問題13】「関数に配列を渡す」とは何か
C言語の関数呼び出しでは、まず引数(実引数)の値を求め、その値を呼び出す関数の仮引数に代入し、その後、関数に制御が移ります。では、「関数に配列を渡す」際にはどうなっているのでしょうか。 - 完全マスター! 組み込みC言語プログラミング(13):【問題12】Cプログラムの見通しが良くなる「関数」を習得しよう!
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。いよいよ関数に話題が移ります。関数を有効に利用できるとプログラムの見通しが良くなるので、ぜひ習得してください。 - 完全マスター! 組み込みC言語プログラミング(12):【問題11】文字列の長さと文字種類の判別
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。複数条件を満たすパスワード確認プログラムを通じて、複数関数の使い方とフラグの立て方を学びます。 - 連載記事「イチから作って丸ごと学ぶ! H8マイコン道」
- 連載記事「完全マスター! 電子回路ドリル」
- 連載記事「完全マスター! 電子回路ドリル II」
- 連載記事「完全マスター! 電子回路ドリル III」