1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語のポインタで躓いたところ

Last updated at Posted at 2019-04-17

なんで書こうとしたのか

 今、mrubyでゲームを作ろうとしていて、どうしてもCを使わなければならなくなりました。それでqiitaで@elct9620が作ってくれた「ヒーロー」というゲームフレームワークを読んでいると、構造体のポインタがでてきました。一応Cでポインタがあってなんとなく分かっているつもりでいました。
 ただし、つもりはつもり。本当に理解をしていませんでした。大体、どこを参照したらいいかとか、アドレスが住所だとか表面的なことしか理解できていませんでした。こう書いている今も当然まだ表面でしか理解ができていません。ですので、忘れないためにも記事を書くことにしました。
 それで、新しい試み。試しに、カラメルさんの「デーモンコアくん」を模した書き方で解説していきます。
 まあ、気軽に読んでください。

はじまるよ〜!

ポインタくん「こんにちは、僕ポインタっていうんだ!
       あ〜でも、みんなポインタってなにかわかるかな?」

そもそも、ポインタってな〜に?

おにいさん「おにいさんがおしえるよ〜!」

ポインタくん「おにんさん!」

おにいさん「ポインタっていうのは、特定の型のアドレスを入れる箱みたいなものだね。例えば

int n = 10;
int *ptr;

ptr = &n;

っていうコードがあったとします。ptrにnが代入しているように見えるようね?見えない?見えていることにするの!

ここではptrというポインタにnのアドレスが代入されているって言うことになるんだよ。これがポインタの使い方っていう感じかな?」

ポインタくん「僕ってそういうふうになっていたんだ!」

お兄さん「君、一体何年ポインタくんやってるのかな?」

ポインタってどこで躓くの?

ポインタくん「でもさ、おにんさん。
     ぼくってなぜかみんなから難しいって言われるんだよね。
     どうして?」

おにいさん「それはね、すぐに理解されずらいからなんだよ。」

ポインタくん「僕が?どうして?」

おにいさん「ぼくも、ポインタくんと最初に出会った時すごく緊張したんだ。
      それは、おにいさんだけじゃなくて、ほかの人もそうだった。
      それじゃあ、ポインタくん。僕が君と最初に会ったときのことで振り返ってみよう!」

ポインタくん「うん!」

おにいさん「では、まずは出会いのコードから見てみようか。」

test1.c
# 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に代入しようとしていたんだよね。」

ポインタくん「でも、このあとコンパイルはしたけど、コアアダプタになっちゃったんだよね。」

おにいさん「そうなんだよ。
      ぼくもポインタくんと会ってすぐであせっちゃったんだよ。
      でも、このあとにポインタくんのことを理解して、もう一度作り直したんだよね!
      それじゃあ、書き直したコードを読んでみよう!」

test.c
# 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だったんだ!」

ポインタくん「そうだったんだ。おにいさん、僕を理解しようとしてくれたんだね。ありがとう!おにいさん!」

おにいさん「こちらこそ!
      それじゃあ、みんなバイバイ(^_^)/~!」

おわり

ためしに作ってみた。後悔はしていない。

参考文献

ヒーロー:https://github.com/elct9620/hiro

ポインタ完全攻略:https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3C%E8%A8%80%E8%AA%9E-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5-%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797388536/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5&qid=1555422930&s=books&sr=1-1-catcorr

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?