前回(2019/11/22)の内容 curses と squash ゲーム curses : キャラクターベースの画面描画ライブラリ squash : curses を利用したキャラクターベースのゲーム => 興味をもつための内容(成績には無関係) 前回のハイライト 配列の情報を、関数に渡すにはどうすればよいか ? 関数の実引数に、「配列名」を指定する事ができる => 関数仮引数で、この「『配列名』を指定する事によって、渡された『値』を利用して」 配列の要素を参照できる cf. 単純変数(『式』)の値を関数に与えるには、実引数に単純変数(式)を指定する => 実引数に、その「単純変数(式)」の「値」が代入される 1. 渡されるは「値」 2. その値は、仮引数に「代入」される => 関数の「仮引数変数」と関数の呼び出し側の関係は、 「値を共有している」 以上のものはない => 関数の呼び出し側と関数の関係が薄くなる # [欠点] 関係が薄いと、効率が悪くなる # [利点] (関係が薄いので..) 他と組み合わせる事が容易になる # C 言語では、関数呼び出しに関しては、 # 「関係を薄くする」事(によって、再利用性を高める事)を重視 !! 仮引数変数の値を変更する(代入)事は、関数の呼び出し側に影響を与えない 配列名を引数に指定できる : 「配列そのもの」が渡されているように見える 「渡す」: 何かしらの「値」が「コピー」される事を「渡す」と呼ぶ => 「配列名」を「渡す」(「配列」は「渡せ」ない ) => 「配列名」が表す(何等かの)「値」が「コピー」される <= 「配列要素」の「値」が「コピー」されるわけではない <= 「配列の要素」は渡されてはいない => どうやって、関数側で「配列の要素の値」を得るか ? # 渡されるのは、配列の最初の要素のポインター値 => 「配列名」は、「配列の要素がある『場所』を示す情報(値)」をもっている 関数の引数に、「場所の情報」を与えれば、その「場所の情報」を利用して、 その場所にある「(配列の)要素」を参照する事ができる # 「配列の要素の値」をコピーせずに、「場所」を渡す理由 # 効率 : 配列のサイズは大きいので、コピーする事は効率がわるい # (良し悪し) : 関数の中で、配列の要素を(直接)変更できる # 良し : 機能が高まる/効率が良い # 悪し : (結果的に配列の要素を共有する事になるので..) 関係が強くなる # => 関数呼び出しによって、「変数の値が変化する」というわかりにくい状況が起きる # 「配列の一部(要素)だけを変更したい」という要望がある # cf. Excel 大量のデータの中の一部だけを更新する 「文字列」の入力は 文字配列の中に、複数の文字と、最後に、'\0' (End Of String) を保存する形になる !! 「文字列」は、「文字配列」で表現できる scanf を利用する場合 形式的には、 scanf ( "%s", 文字配列名 ) で、文字配列に、文字列を入力できるが、この形で、利用するのは『禁止』 上の表現では、scanf に配列のサイズが知らされていないので、危険 実は、 scanf ( "%3s", .. ) のようにサイズを指定する事が可能で、 その場合は安全 さらに、 sannf ( "%*s", サイズ, 文字配列名 ) とする事もできる => 「scanf の書式」でググる !! scanf を利用し場合は、「改行(空白文字)」が入力されない おすすめ fgets ( 配列名, 配列サイズ, stdin ); /* stdin は今回は説明しない */ => これの場合は、「改行」も「入力の一部」になる => 一行ずつ入力する