なんで書こうとしたのか
今、mrubyでゲームを作ろうとしていて、どうしてもCを使わなければならなくなりました。それでqiitaで@elct9620が作ってくれた「ヒーロー」というゲームフレームワークを読んでいると、構造体のポインタがでてきました。一応Cでポインタがあってなんとなく分かっているつもりでいました。
ただし、つもりはつもり。本当に理解をしていませんでした。大体、どこを参照したらいいかとか、アドレスが住所だとか表面的なことしか理解できていませんでした。こう書いている今も当然まだ表面でしか理解ができていません。ですので、忘れないためにも記事を書くことにしました。
それで、新しい試み。試しに、カラメルさんの「デーモンコアくん」を模した書き方で解説していきます。
まあ、気軽に読んでください。
はじまるよ〜!
ポインタくん「こんにちは、僕ポインタっていうんだ!
あ〜でも、みんなポインタってなにかわかるかな?」
そもそも、ポインタってな〜に?
おにいさん「おにいさんがおしえるよ〜!」
ポインタくん「おにんさん!」
おにいさん「ポインタっていうのは、特定の型のアドレスを入れる箱みたいなものだね。例えば
int n = 10;
int *ptr;
ptr = &n;
っていうコードがあったとします。ptrにnが代入しているように見えるようね?見えない?見えていることにするの!
ここではptrというポインタにnのアドレスが代入されているって言うことになるんだよ。これがポインタの使い方っていう感じかな?」
ポインタくん「僕ってそういうふうになっていたんだ!」
お兄さん「君、一体何年ポインタくんやってるのかな?」
ポインタってどこで躓くの?
ポインタくん「でもさ、おにんさん。
ぼくってなぜかみんなから難しいって言われるんだよね。
どうして?」
おにいさん「それはね、すぐに理解されずらいからなんだよ。」
ポインタくん「僕が?どうして?」
おにいさん「ぼくも、ポインタくんと最初に出会った時すごく緊張したんだ。
それは、おにいさんだけじゃなくて、ほかの人もそうだった。
それじゃあ、ポインタくん。僕が君と最初に会ったときのことで振り返ってみよう!」
ポインタくん「うん!」
おにいさん「では、まずは出会いのコードから見てみようか。」
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
struct xyz {
int x;
long y;
double z;
};
struct xyz* a;
int n = 10;
a->x = n;
printf("a.x = %d\n", b->x);
return 0;
}
ポインタくん「ぼくとおにいさんがはじめて会ったときのところだね!」
おにいさん「そう!このとき、おにいさんはxyzっていう構造体を作っておいて、構造体をポインタにしておいてa.xに代入しようとしていたんだよね。」
ポインタくん「でも、このあとコンパイルはしたけど、コアアダプタになっちゃったんだよね。」
おにいさん「そうなんだよ。
ぼくもポインタくんと会ってすぐであせっちゃったんだよ。
でも、このあとにポインタくんのことを理解して、もう一度作り直したんだよね!
それじゃあ、書き直したコードを読んでみよう!」
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
struct xyz {
int x;
long y;
double z;
};
struct xyz* a;
int n = 10;
a = (struct xyz*)malloc(sizeof(struct xyz));
a->x = n;
printf("a.x = %d\n", a->x);
return 0;
}
ポインタくん「あ!mallocっていうのが増えている!」
おにいさん「そうだね!これはbのポインタにメモリを確保したんだ!
そうすることで、ちゃんとbにメモリが確保されて数字をいれられるようになったんだ!
それで、返ってきた数字は10だったんだ!」
ポインタくん「そうだったんだ。おにいさん、僕を理解しようとしてくれたんだね。ありがとう!おにいさん!」
おにいさん「こちらこそ!
それじゃあ、みんなバイバイ(^_^)/~!」
おわり
ためしに作ってみた。後悔はしていない。