C応用3 関数引数とポインタ
C応用3 関数引数とポインタ
関数が処理した結果を呼び出し元に渡す方法として、関数引数にポインタを使う方法があります。関数引数に&演算子を使ってポインタを渡す場合と、配列名を渡す場合があります。関数化の復習をしながら、関数引数にポインタを使うプログラムの書き方を勉強します。
練習問題を通して作ってきたバトルゲームは、本章で完成させます。
動画は、Windows10とVisualStudio2019を使った説明になっていますが、WIndows11とVisualStudio2022を使った場合の操作方法と同じです。
2つの変数にセットされているデータを入れ替える関数を使って、関数の復習をします。ただ、入替え処理はポインタを使わないと入れ替えることができません。
ポインタを使うと何故、入れ替えられるのか、プログラムの動きを追いながら説明します。
・引数にポインタを使うと呼出し元の変数を変更できる
関数呼出しの実引数に&演算子を使い、関数定義の仮引数にポインタを渡すと、関数定義側で、関数呼出ししている側の変数の中身を変更できます。
・構造体のアドレスを実引数渡しすると仮引数は構造体ポインタで受ける
構造体にデータ入力する処理を関数化する場合、&演算子で実引数を指定し、関数定義側は構造体ポインタで仮引数宣言、関数定義のプログラムは、アロー演算子を使うことになります。
練習問題12のプログラムを関数化しましょう。キー入力したデータを構造体にセットするstatus_input関数と、バトルを行うbattle関数を作ってみてください。
練習問題13では、名前、体力、ちから、素早さといった属性を全てキー入力しましたが、名前から体力、ちから、素早さデータを自動生成するように変更します。
ステータスを自動生成する関数(status_create)を作成し、以下の修正をしましょう。
プレイヤーの名前だけ入力してステータスは自動生成、その結果を表示する
対戦相手の名前だけを初期化してステータスを自動生成、その結果を表示する
関数呼出しの実引数に、&演算子を使ってアドレスを指定する場合と、配列名を指定する場合、どちらもポインタを渡すことになります。ポインタ型の仮引数宣言は、*を使った宣言と、[ ]を使った宣言の、どちらを書く事もできます。ポインタの指す先が複数要素から構成される配列なのか、単独領域なのかを識別できるような書き方を説明します。
・単独変数は*で配列は[ ]で仮引数宣言する
ポインタ型の仮引数宣言は、*を書く方法と [ ]を書く方法があります。文法的にはどちらを書く事も可能ですが、読みやすさの観点から、単独変数を扱うのか、配列を扱うのかで、仮引数宣言を書き分けるようにします。
練習問題14で作成したプログラムを、練習問題16では、対戦相手を追加したり、削除したりできるメニューを扱うプログラム(メニュー処理プログラム)に進化させます。今回の練習問題は、以下の修正をして、メニュー処理プログラムにするための準備をします。
配列の要素数はマクロ定義したマクロ名にする
初期化する要素数より大きな要素数を宣言する(サンプルでは、初期化する数を5、要素数を8にしています)
表示メニュー関数(menu_disp_proc), キャラクタ配列表示関数(charas_print), ステータス表示関数(status_print)を作成し、これらの関数を呼び出すようにする
ステータス表示関数(status_print)では、ステータス自動生成を行っていますが、全角文字の名前に対応できていないため、全角文字にも対応できるようにする
ステップ1:表示メニュー
ステップ2:追加メニュー
ステップ3:削除メニュー
ステップ4:戦闘メニュー
constを付けて変数宣言すると、その変数は変更できなくなります。constは、データ型を修飾するためのキーワードで、型修飾子と呼ばれています。特に、仮引数のポインタ宣言にconstを付けると、指す先を変更しないことが明確になるため、プログラムの可読性を向上させることが出来ます。標準関数でもよく使われるテクニックです。
・constは変更できなくする
普通の変数宣言にconstを付けると、宣言した変数を変更できなくします。ポインタ型の場合は、ポインタの指す先が変更できなくしますが、ポインタ変数自身は変更することができます。
・仮引数のconstの付いたポインタは見るだけ宣言になる
仮引数で受け取ったポインタの指す先を、参照しかしない場合は、仮引数宣言でconstを付けるようにします。
練習問題16で作成したメニュー処理をするバトルゲームの関数の中で、関数の仮引数がポインタのものについては、その指す先を参照しかしていないものには、constを付けて、プログラムの可読性を向上さるようにしましょう。
「一通りポインタを勉強したけど、よく分からない」という人向けに、ポインタのイメージを持ってもらい、どうして必要なのかを説明します。
ポインタをイメージする
ポインタが必要な理由1
ポインタが必要な理由2
上記で説明した練習問題と同じ問題です。
下記のYoutubeの動画の説明の所にはダウンロードのURLが記載されいます。
main.cppというソースファイルを含むVisual Studio 2022のプロジェクトファイル一式がダウンロードできます。ソースファイルは未完成の状態です。ソリューションファイルからVisual Studioを立ち上げ、プログラムを完成させてください。
《練習問題13》
バトルゲーム(入力とバトルの関数化)
《練習問題14》
バトルゲーム(ステータスの自動生成)
《練習問題15》
バトルゲーム(配列表示を関数化)
《練習問題16》
バトルゲーム(メニュー方式)
《練習問題17》
ポインタ型の仮引数宣言にconst
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答