こんにちは､ そしてようこそ｡
この講義では､ 引数とパラメータについてお話したいと思います｡
これらの用語は､ 同じ意味で使われることが多いようです｡
彼らが扱わなければならないのは､ 基本的に関数に渡すデータである｡
つまり､ パラメータは変数であり､ 関数宣言と関数定義の実装である｡
関数宣言､ 関数プロトタイプ､ 関数定義の違いを覚えておいてください｡
関数宣言はメソッドのシグネチャに過ぎず､
関数のヘッダとなる｡
関数定義は､ その関数の実装､
実際のコードである｡
いずれも､ 用語の定義､ それらの違いを理解してください｡
しかし､ パラメータは関数の宣言や定義にあるもので､ そのヘッダにあるものです｡
なぜなら､ ヘッダは両方とも宣言の中の定義に含まれるからです｡
関数が呼び出されたとき､ 引数は関数のパラメータに渡すデータです｡
これらは､ 関数に渡される変数の実際の値です｡
つまり､ 関数ヘッダ内で定義された関数パラメータと､
関数が呼び出されたときに指定する必要がある引数のプレースホルダです｡
ここで､ 引数とパラメータの違いを理解してください｡
パラメータは､ 関数の定義や宣言に関係するものです｡
引数とは､ 関数を呼び出すときに､
渡すデータのことです｡
だから､ 引数は起動するときに使う｡
これらは私の関数に渡す引数だと言うことでしょう｡
そして､ 関数がそのデータを受け取るとき､ それらはパラメータとして参照される｡
関数のパラメータは､ パラメータ名とそのデータ型のリストである｡
各パラメーターはカンマで区切られる｡
パラメータの一覧は､ 関数名の後に括弧で囲まれています｡
関数はパラメータを持たないことができ､ これは関数に渡されるデータがないことを意味します｡
この場合､ 左括弧と右括弧の間に空白を入れるか､ あるいは空白にするか､
何も入れない空白のままでも構いませんが､ 間に空白を入れるのがよいでしょう｡
Voidは何も意味しない特別なキーワードで､ パラメータも戻りデータもないことを意味します｡
パラメータは､ 関数にデータを渡すための手段です｡
呼び出し側の関数から呼び出される関数に渡されるデータ､ 呼び出し側eから受け取り側､
呼び出し側と受け取り側｡
パラメータの名前は､ その関数のローカルなものです｡
そのあたりは､ ローカルデータのお話の時にでも｡
しかし､ これらのパラメータ名は関数本体の中にしか存在しない｡
渡された引数の値を前提とする｡
つまり､ addという関数があり､ 引数として変数を渡し､
値5を渡し､ パラメータxを持つ関数があれば､ 関数本体のどこでもxは5と等しくなることになります｡
関数本体は､ これらのパラメータを実装に使用する必要があります｡
そうでないなら､ 成立させるべきではなかったのです｡
関数宣言の定義にパラメータ変数が定義されていて､
その変数を関数内部で使うことがない場合､ それは必要ないと言っているに等しいので､
無駄なので含めないでください｡
データを使用しない関数にデータを送らないでください｡
関数本体には､ 関数の実装に必要なローカル変数が追加で定義されている場合があります｡
関数本体の内部で他の変数を宣言している場合がありますが､
これは完成したタスクに必要だからです｡
渡されたデータだけを操作するわけではないんですね｡
関数内部でローカルデータを操作することができます｡
関数の引数として配列を渡す場合､ 追加の引数として､
配列のサイズを指定する別のパラメータを定義して渡す必要があります｡
この理由は､ この関数が配列の要素数を知る術がないからです｡
そのため､ サイズ50の配列を宣言しても､ 30要素しか格納されていない場合があります｡
また､ 関数本体の中で配列を使用する場合､ ループを使って反復処理するか､
要素にアクセスする必要があるため､ 配列の大きさを知っておく必要があるでしょう｡
また､ アクセスエレメントがそれを反復している場合､
いつ圏外になったかを知る必要があります｡
そして､ そこでアウトオブバウンズについて､ なぜそれが重要なのかについて話をしました｡
さて､ ここで一例をご紹介しましょう｡
printf関数を呼び出すと､ 必ず1つ以上の値が引数として渡されます｡
最初の値は､ 二重引用符で囲まれた文字列である｡
残りの値は､ 表示する任意の変数である｡
これは実際には可変数の引数を取る関数ですが､
このクラスは初級クラスなので､ おそらくこの話はしないでしょう｡
しかし､ printf関数は､ データを渡すという点では良い例です｡
なぜなら､ 引用符の中の文字列や表示したい変数など､ 複数のデータセットを渡すことになるからです｡
そのため､ 関数にデータを渡すことができるのはとても重要なことなのです｡
機能の有用性と柔軟性を大幅に向上させることができます｡
もし関数がデータを受け取る機能を持たなければ､ これほど便利なものはないでしょう｡
前回の講義で提供した､ 出力を表示する関数の例では､
実際には大したことはしていません｡
とても静的なものでした｡
起動するたびに同じことを繰り返していましたね｡
しかし､ データを受け取る関数があれば､ 表示内容をコントロールすることができますよね｡
だから､ printf関数と同じように
もしprintf関数にパラメータがなければ､ 何を表示させるかを指示することはできません｡
データを受け取らなかったら､ この変数を表示しろとか､ この文字列を表示しろとか､
言えないじゃないですか｡
あまり意味がないでしょう｡
そこで､ 関数にデータを渡すことができるようにすると､ より便利で柔軟な使い方ができるようになります｡
そして､ それを見てください｡
掛け算の関数をやるにしても､ 毎回同じ2つの数字を掛け合わせるのは嫌でしょう？
パラメータをとって､ 2つの数字分のデータが渡されることになる｡
つまり､ 渡されたデータに応じて異なる計算をすることができるんだ｡
データ受け渡しと､ それがなぜ便利なのかを理解することはとてもとても重要です｡
また､ 自分で定義した関数の前にコメントを付けるのも良いアイデアです｡
この関数が何をしようとしているのか､ 引数がどのように使われるのかを説明するのに役立ちます｡
通常､ このように表示されます｡
これは私の例を見ればわかると思います｡
ファイルの先頭には関数の宣言があり､ 関数の定義がありますよね｡
関数定義には､ 関数ヘッダが含まれる｡
関数のヘッダーのすぐ上に､ コメント､ 通常は複数行のコメントがあります｡
スラッシュ､ アスタリスクがあるんですね｡
そして､ 関数の名前､ 関数の目的､ 関数に渡されるデータも記述します｡
これは､ やはりメンテナンスのためで､ より早くエラーを発見して修正できるようにするためです｡
通常､ 何かを教えてくれるような関数には､ それなりの名前を付けておきたいものです｡
しかし､ コメントを追加することで､ さらに多くのことがわかるようになります｡
これは2つの数値を掛け合わせる関数で､ 渡されたデータを取得する例です｡
2つの数字を掛け合わせる｡
本質的にパラメータを持っているので､ 関数であることがわかる｡
括弧がついている｡
それが､ 括弧を見たときに関数を識別する一つの方法です｡
つまり､ 戻り値の型があるので､ 特定することもできるのです｡
機能であることを示すものは複数あります｡
しかし､ 主なものは括弧と､ ブロックの開始と終了を意味する中括弧です｡
この2つの数字を掛け合わせる機能ですが｡
関数のパラメータは､ 括弧の間に定義され､ その後カンマで区切られることを覚えておいてください｡
ここでは､ 2つのパラメータを用意しています｡
xというパラメータとyというパラメータがあります｡
各パラメーターについて､ 入ってくるデータ型を特定する必要があります｡
ここで､ 2つのintを用意しました｡
これが標準的なデータの受け渡し方法とその方法です｡
括弧の間には､ データ型､ そして変数の名前を指定します｡
変数の名前は､ cで有効なものであれば何でも良いので､
x y zと好きなように呼ぶことができます｡
ただ､ ドル記号のマークで始めるのはダメなんです｡
そして､ それらをカンマで区切って､ 括弧の中のパラメータという慣習に慣れることです｡
もし､ パラメータがなく､ 関数に渡されるデータもない場合､
この括弧の間に表示されるのはvoidか､ あるいは何も表示されません｡
この関数でできることは､ 渡されたデータ､
つまりxとyという2つの変数を受け取り､ それらを掛け合わせてresultという変数に格納することだけです｡
そして､ 何をするかというと､ データをプリントするのです｡
乗算されたデータをプリントアウトします｡
しかし､ 再び､ データを取るので､ 関数の柔軟性と有用性を見てください｡
渡すものによって､ 異なるデータを表示することができます｡
このメインルーチンで関数を呼び出すと､ 2つの数値を掛け合わせると言って､
引数を渡します｡
値10と20を渡す｡
ここでも変数名を渡すことができる｡
でもこの例では､ 10と20と言っているだけです｡
これは2つの数値を掛け合わせる関数を呼び出すもので､
最初のパラメータとしてデータ10､ 2番目のパラメータとして20が渡されます｡
つまり､ xは10に､ yは20に等しくなる｡
つまり､ x×yの掛け算をすると､ 10×20となり､
結果は200を格納し､ その結果をx
y zに渡される変数とともに表示することになります｡
だから､ 10 20と表示され､ さらに200と表示されるのです｡
また､ この関数を再利用できるようになったことにも注目してください｡
メイン関数の2行目で､ データ値20と30という異なるデータを指定して､
再度呼び出しています｡
そして､ 50に2を掛けるために､ 3回目にまた呼び出すのです｡
このように､ 異なるデータを受け取る関数を作ることができると非常に便利で､
再利用が可能で､ 柔軟性があります｡
そして､ 構文がとてもわかりやすい｡
カンマで区切られた括弧の中に2つの変数があるだけです｡
そして､ 呼び出すのはもっと簡単で､ 名前をスペースで区切るだけで､
2つのデータが揃うのです｡
どのようなデータであっても､ 共通側の括弧で区切られ､
セミコロンで終了する｡
関数にはどんな種類のデータも渡すことができます｡
配列を渡すことができます｡
また､ 他のデータ型をどのように渡せるかについても説明します｡
ここでは簡単な例を示しましたが､ ポインターを渡すこともできますので､ まだ説明していません｡
構造体で渡すことができます｡
ここでも､ まだ話していないコンセプトがあります｡
しかし､ ここにデータを渡すと､ 本当に､ 意味のある､ 便利なものになるのです｡
これは簡単な例です｡
構文に注意して､ これを勉強し､ あなたが別の関数の数を記述するあなたのための良い挑戦を提供します｡
ありがとうございます｡