|
- 474 :( ´∀`)さん :2005/09/18(日) 12:19:38 ID:magnZxnv0
- 1/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | わかる人は良くわかるけど、わからない人は | 全くわからないシリーズです。 \__ _________________ ━━━∨━━━━━━━━━━ 今日のテーマ ,__ C言語とポインタ iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |確かC言語はプログラム言語だよな?ポインタ? \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | プログラムをやった事が無い人はわからない | だろうけど、C言語をやったときにまず間違いなく | つまづく超難関なんだ。プログラミングの科目で | 試験前に青くなってたヤシも多いはずだ。 \________________
- 475 :( ´∀`)さん :2005/09/18(日) 12:20:12 ID:magnZxnv0
- 2/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | C言語とは1973年にデニス・リッチーらによって | 作られました。移植性の高さ、幅広い用途に | 使用できるので普及しました。 \__ _________________ ━━━∨━━━━━━━━━━ ,__ とりあえずその辺の事情は省略 iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |30年も前の事か。って省略かよ。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | ちなみにC言語の世界でHello, world!の次に | 有名な言葉であるK&RのRってリッチーの | Rだったり。 \________________
- 476 :( ´∀`)さん :2005/09/18(日) 12:20:47 ID:magnZxnv0
- 3/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | なぜポインタがむずかしいか、ポインタの難しさは | 人間にわかりやすいように作られたプログラム言語 | なのになぜかメモリというハードウエアを気にしないと | いけないことにあります。 \__ _________________ ━━━∨━━━━━━━━━━ BASICはメモリなんて気にしなくて良かった ,__ のにね。 iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |ハードウエアというものを意識させないように |する事はコンピュータの進歩の中である意味 |テーマなのに。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | でも難しいんだったら使わなければ | いいんじゃないか? \________________
- 477 :( ´∀`)さん :2005/09/18(日) 12:21:21 ID:magnZxnv0
- 4/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | そうはいかないのです。C言語では特に文字列を | 扱う際にポインタはついて回り、ポインタ無しでは | 使う事はほぼ不可能です。 | 例えば、実はこんなところにもポインタがかかわって | いるのですが、わかりますか? \__ _________________ ━━━∨━━━━━━━━━━ scanf("%d",&i); ,__ scanf("%s",s); iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |えーと、上はキーボードから数値を入力する |場合で、下は文字列を入力する場合だが |ここにどうしてポインタが? \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | この関数、実はむちゃくちゃ危ないのだが、 | そのメカニズムは、またもう1本講義が出来る | くらいだから、ここでは省略する。 \________________
- 478 :( ´∀`)さん :2005/09/18(日) 12:21:52 ID:magnZxnv0
- 5/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | まずポインタがなにかを知る前に変数をおさらいしておきましょう。 | 本では、変数は箱のようなものであると説明されます。 | 箱は整数用、小数用、文字用と用途に合わせて専用なものが | 用意されている事は問題ないと思います。 \__ _________________ ━━━∨━━━━━━━━━━ 例 int a; aと言う名前の整数用の変数を宣言 float b; bと言う名前の浮動小数点用の変数を宣言 ,__ iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |変数には整数型、浮動小数点型、文字列型 |とかいろいろなタイプがあってそれぞれ全然 |別だから使い分けないといけないと。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | 変数を使う前には必ず、どのようなタイプのなんと | 言う名前の変数をつかうか宣言しないといけない | のは変数を使う上で大事なお約束だからな。 \________________
- 479 :( ´∀`)さん :2005/09/18(日) 12:22:23 ID:magnZxnv0
- 6/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ポインタも変数なので、ポインタを使いたい時は | ポインタ型の変数を宣言してやればよいのです。 | 当然中に入るのはポインタです。 \__ _________________ ━━━∨━━━━━━━━━━ ,__ int *p; pと言う名前のポインタ型の変数を宣言。 iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |*pって名前の整数用の変数を作ったわけじゃないぞ。 |*がなければ普通の変数で、*があるとポインタの変数 |って非常に紛らわしいな。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | てかさっきからポインタポインタって言ってるけど、 | ポインタってなんだ? \________________
- 480 :( ´∀`)さん :2005/09/18(日) 12:23:02 ID:magnZxnv0
- 7/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ここが今回の一番重要なところですからよく聞いてください。 | | コンピュータのメモリには位置を示すアドレスが振ってあります。 | ポインタとはメモリのアドレスのことなのです。 | 解説書読むとき、ポインタをメモリのアドレスと置き換えて読むと | だいぶわかりやすくなります。 \__ _________________ ━━━∨━━━━━━━━━━ 整数型の変数には変数が、文字列型の 変数には文字(の1文字)が入っているように ,__ ポインタ型にはメモリのアドレスが入ります。 iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |アドレスが入っている変数なんて言われても |全然ピンと来ないな。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | どんな例があるか示して欲しいな。 \________________
- 481 :( ´∀`)さん :2005/09/18(日) 12:23:33 ID:magnZxnv0
- 8/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | たとえばポインタは配列と一緒に使われます。 | 皆さんはC言語では文字列は1文字ごとの配列としてしか扱えない事は | もうわかってますよね。これを変数の引数として渡してあげないといけない | ときはこうなってしまいます。 \__ _________________ ━━━∨━━━━━━━━━━ char s[100]; 関数1(s[0],s[1],s[2],・・・,s[99]); ,__ iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |変数の引数はひとつごとにひとつの値しか |渡せないからって…. \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | こりゃ大変だ. \________________
- 482 :( ´∀`)さん :2005/09/18(日) 12:30:29 ID:magnZxnv0
- 9/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | そこで配列の先頭のアドレスを引数として渡し、 | 中身は呼び出し先の関数が引数のアドレスから | たどって読み込んでもらいます。 \__ _________________ ━━━∨━━━━━━━━━━ ,__ 関数1(文字列の先頭のアドレス); iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |これだと引数は1つで済む訳だ。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | C言語は配列はs[0]s[1]s[2]・・・と順序良く | メモリに並んでる事が保証されているから | 出来るテクニックだ。 \________________
- 483 :( ´∀`)さん :2005/09/18(日) 12:31:01 ID:magnZxnv0
- 10/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 他にもこんな事があります。 | ところでC言語では関数1と2に同じ名前の変数が | あったとしても別物と扱われる事はよいですね。 \__ _________________ ━━━∨━━━━━━━━━━ 〜〜値渡し〜〜 関数の引数は値のみが渡されて変数そのもの が渡されるわけではない。例えば値が5の変数 aを渡した時、5という値のみが渡り、変数aが 渡るわけではない。だから呼び出し先の関数で aを変化させたとしても呼び出し元のaは5のまま ,__ 変化しない。 iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |これがあるから関数同士で名前がかぶるかを |心配しなくて良くなるんだよな。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | でも変数を書き換えたいときは困るぞ。 \________________
- 484 :( ´∀`)さん :2005/09/18(日) 12:31:36 ID:magnZxnv0
- 11/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | そこでポインタの出番となります。関数には書き換えたい変数の | ポインタを渡します。変数の格納されているメモリアドレスは | どの関数から見ても同じなので、そのポインタに相当する | メモリ領域を書き換えれば呼び出し元の変数も書き換わる事に | なります。 \__ _________________ ━━━∨━━━━━━━━━━ たとえば変数の値を交換するswap関数を作る。 1.交換したい変数a、bアドレスを引数として渡す。 2.関数の処理としてaのアドレスの内容をbのアドレスに、 bのアドレスの内容をaのアドレスに書き込む。 3.swap関数を抜けるとあら不思議、aとbの内容が ,__ いれかわっている! iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |練習問題としてどんな関数になるか |作ってみてくれ。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | ポインタを使わないで値だけ渡して | 交換した後どうなってるか見てみると | よくわかるぞ。 \________________
- 485 :( ´∀`)さん :2005/09/18(日) 12:32:10 ID:magnZxnv0
- 12/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ここで先ほどの例に戻りましょう。2番目の引数は実は | 変数ではなくて変数のアドレスを示したポインタだったのです。 | 理由はもうわかりますよね。 \__ _________________ ━━━∨━━━━━━━━━━ ↓これは変数そのものじゃなくって scanf("%d",&i); 変数のポインタ。 ,__ scanf("%s",s); iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |変数に値を入力するって事は変数を書き換える |ということだからポインタでないとだめなのか。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | &iはiのアドレスを表す。なぜ文字列の | sには&が付いてないかはリクエストが | あれば講義するそうです。 \________________
- 486 :( ´∀`)さん :2005/09/18(日) 12:32:47 ID:magnZxnv0
- 13/13
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ポインタがなんとなくわかりましたか? | わからない人はぜひ教官室に来てください。 | 最近語り合ってくれる人が居なくて寂しいですから。 \__ _________________ ━━━∨━━━━━━━━━━ ,__ 今夜は帰しませんよ iii抗∧ / ━ (*゚ー゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ ((((゚Д゚,,)))) (゚Д゚,,) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |課題無しはいいけどやっぱり怖い…ガクブル。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | まあ他にもわからないことがあればリクエスト | してくれると講義できるかもしれない。 | でもC言語ってなんですかって所からは勘弁して。 \________________
- 487 :( ´∀`)さん :2005/09/18(日) 12:56:32 ID:8apl9qF/0
- >>486
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |講義乙っす |是非とも&についての講義をお願いします \  ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧∧ (゚Д゚,,) φ つ √ ̄ (___ノ〜 || ━┳┛
- 488 :( ´∀`)さん :2005/09/18(日) 15:49:13 ID:Pm4hJTsY0
-
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |講義乙です。 |ポインタはわかるけど、C++でクラスのオブジェクト作ったら |そんな型は知らない、と言われてしまう今日この頃。 \  ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧∧ (゚Д゚,,) φ つ √ ̄ (___ノ〜 || ━┳┛
|
|