Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
みかん
世界一わかりやすいポインタ
その他の方向指示器
これが方向指示器
方向指示器わかった?
のタイトルを奪われるぐらいすごいトピックができました。
コンピュータにちょっと詳しい人なら一発で解るポインタの利点
ok?
世界で2番目に
わかりやすいポインタ
http://codecodium.com/scribbles/webmaster/314
上を見て
これが方向指示器
そして、
この矢印も方向指示器
よって、この資料は、
世界一わかりやすいポインタから、
世界で2番目にわかりやすい、ポインタとさせていただきます。
もっと、わかりやすい記事ができたら、 @super_rti まで、ご連絡ください。
方向の先には、非常口がある。
方向指示器
ポインタについて、
世界で2番目に解りやすく説明します。
もっとわかりやすい資料を見つけた人は、
@super_rti まで、連絡ください。
世界で2番目の看板を差し上げます。
by rti
方向指示器
上を見て
ポインタって何?
方向指示器って何?
の、ことだよ。
方向指示器
問題:
答え:
みかんの方向指示器の向こうには、
みかんがある。
自転車がある。
方向指示器の先を見ると
その物があるよ。
家
りんご
と
がありました。
家
りんご
自転車の方向指示器の向こうには、
何がありますか?
りんごの方向指示器
家の方向指示器
みかん
家の方向指示器
りんごの方向指示器
ok?
家
りんご
自転車
家
りんご
自転車
家は重いが、方向指示器は軽い
家の方向指示器の先には、
家がある。
自転車とかでも
方向指示器の先には、
ものがある。
お金をすごくかければ、
家も運べなくもないけど、
ちょっと困るよね。
まとめ
彼のところに
物を渡すと
なんでも長さを測ってくれます。
家の方向指示器
彼に、家まで計りに来てもらいたい。
家の方向を教えるために、
家への方向指示器を渡します。
家の方向指示器の方向に
テクテク歩いていくと、
家があるので、長さを測ってもらえた
あるところに、
長さを測ってくれれる人
が、いました。
だけど、測ってもらうには、
彼にものを渡さないとダメです。
手元にないものは、測れません。
家
この先には、家がある。
家そのものを渡すのは難しい
で、
方向指示器があると
何が嬉しいの?
ok?
りんご
家への方向指示器を渡すことで、
家を渡さずに済んだ。
自転車
りんごは軽いから持って行って渡せるね。
自転車も、なんとか持っていけるかな・・・
だけど、家は重くてもっていけないよね。
こっちに僕の家があります。
家とかみたいに、
持っていけそうにないものは、
方向指示器で
どこにあるかを教えてあげる。
こっちに僕の家があります。
家
こっちに僕の家があります。
家
みかん
超重い
方向指示器は、
看板みたいなもの。
超軽い
家
家の長さを測ってもらうには?
家
家の長さを測ってもらうには、
どうするればいいのかな?
家
1200cmです。
自転車は、150cm!!
りんごは、5cm!!
これから説明するね!!
家の方向指示器を渡すのは簡単
方向指示器のことを
ポインタと呼ぶよ。
実はそれだけのこと
ok?
家
void main()
{
int myhouse = 123;
int* myhouse_ptr = &myhouse;
}
void main()
{
int myhouse = 123;
int* myhouse_ptr = &myhouse;
*myhouse_ptr = 456;
}
void main()
{
int myhouse = 123;
int* myhouse_ptr = &myhouse;
printf("%d",*myhouse_ptr);
}
//ポインタ経由で、
//myhouse が 456に上書きされる
家
C言語で考えてみよう
ok?
ポインタ(方向指示器)の方向に、てくてく歩いて行って、
その方向にあるものを見たいときは、
変数の前に * をつけるよ。 *myhouse_ptr
変数を指す
ポインタ(方向指示器)にするには、
変数名の前に、& を前につけるよ
ポインタ(方向指示器)の方向に、てくてく歩いていくことで、そのものに触れることができるけど、
見るだけではなくて、
こっそり書き換えることもできるよ。
ポインタ(方向指示器)が入っている、
ポインタ型だよというのを表現するのには * マークを使う。
*マークは、型の後ろにつけるよ。 int* みたいに。
注意:
変数の前に * を付けられるのは、ポインタ型 (int* とか)だけ。
myhouse は int型だから、 *myhouse としたらエラー。
ここから書きなおした!
超でかい型
だから、
軽いポインタで渡すよ!!
家を運ぶのは、
大変という話しがあったね。
(スタック経由で、)
引数で値が
コピーして渡される
C言語で考えてみよう
int len(int target)
{//長さを測る
}
void main()
{
int ans;
int myhouse = 123;
ans = len(myhouse);
}
ok?
struct bighouse
{
int window;
int foo;
int bar;
};
int len(struct bighouse* target)
{//長さを測る
}
void main()
{
int ans;
bighouse myhouse;
ans = len(&myhouse);
}
struct bighouse
{
int window;
int foo;
int bar;
};
int len(struct bighouse target)
{//長さを測る
}
void main()
{
int ans;
bighouse myhouse;
ans = len(myhouse);
}
その2
ポインタなら、
方向指示器だから、
軽いね
でかいの
コピーするのは大変
で、何が嬉しいの?
家
int型は、りんごみたいに軽いからいいんだけど・・・
いろいろ修理してもらおう。 省略表記もあるよ
ポインタを使って修理に来てもらえばいい。 これで解決。
コピーした方を直してしまっている。
こっちを直しちゃう
ガシャーン
窓を修理しよう!!
ポインタを使って
修理に来てもらえばいい。
家
void repair(struct bighouse target)
{//窓を修理する
target.window = 1; //修理したことにはならない。
}
void main()
{
bighouse myhouse;
myhouse.window = 0; //1にしたい。
//この中で、myhouse.window を 1にしたい。
repair(myhouse);
}
ok?
C言語で考えてみよう
void repair(struct bighouse* target)
{//窓を修理する
(*target).window = 1; //OK
}
void main()
{
bighouse myhouse;
myhouse.window = 0; //1にしたい。
//この中で、myhouse.window を 1にしたい。
repair(&myhouse);
}
void repair(struct bighouse target)
{//窓を修理する
target.window = 1;
}
void main()
{
bighouse myhouse;
myhouse.window = 0; //1にしたい。
//この中で、myhouse.window を 1にしたい。
repair(myhouse);
}
void repair(struct bighouse* target)
{//いろいろ修理する
(*target).window = 1;
(*target).冷蔵庫 = 1;
(*target).テーブル = 1;
//(*target). って書きづらいので、
//->を使っても書くこともできる
target->window = 1;
target->冷蔵庫 = 1;
target->テーブル = 1;
}
その3
copy
同じ意味
家
コピーと参照
値渡しだと、コピーされる。
そのため、コピーした方を、
修正することになる。
野球ボール
窓が割れた!
修理に来てもらった
ここでコピーが作られる
元は壊れたまま
どういうこと→
constがついていると書き換えられない。
実は、len関数の実装はこうなっていた。
const
長さを図ってほしいだけなのに、勝手に窓を割られた。
呼ぶ関数の実装を見ないと、
破壊されるかどうかわからない。
int len(const struct bighouse* target);
int len(struct bighouse* target)
{//長さを測る・・・
//と見せかけて、窓を破壊する。
target->window = 0; //割る
}
C言語で考えてみよう
const
見ないとわからない
int len(const struct bighouse* target)
{
target->window = 0; //割ろうとすると、
//コンパイルエラー!!
}
ok?
その4
int len(struct bighouse* target);
//省略
void main()
{
int ans;
bighouse myhouse;
ans = len(&myhouse);
}
int len(struct bighouse* target);
int len(struct bighouse* target)
{//長さを測る・・・
//と見せかけて、窓を破壊する。
target->window = 0; //割る
}
constをつけていると、基本的に書き換えられない。
constがついているということは、
見るだけで書き換えませんよ。と、教えてくれる。
書き換えないものは constをつけよう。
constは奥がもっと深いが、今はどうでもいい。
ポインタで渡すと、
勝手に値を
書き換えられる可能性がある。
constからきますた
int len(const struct bighouse* target);
ポインタで渡すということは、
重い物を軽く渡せるのと、
同時に、
値をいじられるという可能性がある。
書き換えようとすると、
コンパイルエラーで止めてくれる。
確認しないと・・・
でも、それって
めんどくさい!!
方向指示器の方向にものがないと
大変なことになっちゃう!!
*myhouse
これが、アクセス違反エラー
*myhouse
家
ポインタの
方向指示器の方向に従って
歩かせるときは、
ちゃんと方向を指している
必要がある。
もし、
方向指示器の方向に歩いていったのに、
ものがなかったらどうなる?
ok?
意地悪な話
*myhouse
みたことある?
イタヅラして、
方向指示器を曲げてみた。
海に落ちたくないよ。
テクテク。
家どこ?
家
海
どぼーん
海
どぼーん
海
どぼーん
海
家がなかったら?
もう疲れたので誰か書いて!!
配列と
ポインタ演算