講義1

プログラミングI
第13回(7月15日) キーワード:珠洲
お知らせ
ホームページ h(p://dali.ikulab.cs.priv.teu.ac.jp/moodle 教科書について 必ず教科書を購入してください。 購入の方法は第1回、第2回の授業資料に書いてあります。 ファイルの作成に少し時間がかかりますが、教科書は 必ずダウンロードしてください。 お知らせ
出席について 火曜日の出席 授業中にキーワードを言いますので、ホームページから それを記入して送信してください。教室は自由です。 木曜日の出席 13時25分の着席状況で出欠の記録とします。 指定された席で受講してください。 5月15日〜7月17日の期間に5回以上の欠席があった 場合、欠席の理由がなんであれ、X評価となります。 お知らせ
最終試験について 第14週の演習の時間(7月24日3限)に行います。 自分の教室の自分の席に遅れないように着席してください。 本人確認を行いますので学生証を必ず持ってきてください。 テスト期間中の試験は最終試験の不合格者が対象です。 お知らせ
教科書とこの授業に連動した解説動画があります。 主に復習に活用してください。 h(ps://www.youtube.com/channel/UCOa5vxu4zTrYDOI9A4Ix9JQ 又はyoutubeで「KanoInfoNet」を検索 動画は不定期に追加されていきます。 今後、この授業で出題した問題の解説ビデオもアップされる予定です。 課題9−3、課題10−1,2,3 の解説動画になる予定です。 関数とポインタ 関数への値渡しは値のコピーである。 → 呼び出し側のブロックで宣言された変数は 関数の中では操作できない。 ただし、関数にポインタを渡すと呼び出し側の変数も操作できる 関数とポインタ 例:リスト9.8を少し改変(二つの変数の値を入れ替える関数) #include<stdio.h> void swap(int *p, int *q) { int tmp; tmp=*p; *p=*q; *q=tmp; } int main(void) { int a=3,b=4; swap(&a,&b); princ(“a=%d,b=%d\n”); return 0; } 関数swapの仮引数p,qは変数a,bの アドレス値が渡される(コピーされる) ここで操作している値はmain関数内で 確保したアドレス上にある値なので、 変数a,bそのものを操作することになる。 変数a,bのアドレスが実引数 関数とポインタ 配列を実引数として関数に渡す場合は配列の先頭アドレスを渡している → 関数の仮引数はポインタで宣言されていないといけない 例: 関数の宣言 → void func(char *str); 又は void func(char str[]); 呼び出し側 → char str[]=“Hello!”; func(str); 配列の値(例なら文字列Hello!)がコピーされるわけではない。 関数の中で文字列を操作すると呼び出し側の文字列も変わる。 関数とポインタ 関数の戻り値はひとつだけである。 → 複数の値を関数の処理の結果として呼び出し側に反映できない。 解決方法1 → 結果を記録する領域を先に渡しておく。 解決方法2 → 渡された領域(配列など)のどれかに結果を代入して、 その領域の先頭アドレスを戻り値として返す。 関数とポインタ 例:解決方法1(strcatと同じような働きをするプログラム) void mystrcat(char *st1, char *st2, char *st) { st1とst2の指す文字列を読みだして stが指す領域に書き込むプログラム
} int main(void) { char st1[10],st2[10],st[20 ]; mystrcat(st1,st2,st); princ(“%s\n”,st); return 0; } あらかじめ、結果を代入したい 領域の先頭アドレスを渡しておいて 関数の中でそこに値を代入する。
関数とポインタ 例:解決方法2(strcatと同じような働きをするプログラム) char *mystrcat(char *st1, char *st2) { st1とst2の指す文字列を読みだして st1が指す領域に書き込むプログラム
return st1; } int main(void) { char st1[10],st2[10],*st; st=mystrcat(st1,st2); princ(“%s\n”,st); return 0; } 結果の文字列が代入された文字配列の 先頭アドレスを表すst1を戻り値としている ただし、mystrcatの中で宣言された領域は 戻り値に出来ません。 戻り値を文字型へのポインタstに代入し stを使って結果を表示している まとめ
今日のまとめ 関数の引数と戻り値にポインタを使うことができる 例えば複数の値のやり取りなどに使うと便利である → もちろんそれ以外にも有効な用途はある。