カノジョと学ぶポインタと参照

  • 9
    Like
  • 0
    Comment

この記事は、カノジョできないエンジニア Advent Calendar 2016の19日目の記事です。


カノジョ「

java.lang.NullPointerException
    at kanojo.inai.engneer.Main.main

カノジョとの対話形式にしようとしましたが、どうあがいてもぬるぽだったためこの記事にカノジョは登場しません。
また、上ではJavaですが、今回扱うのはC言語です。

カノジョできないエンジニアにとって以下の公式は成り立つと考えられます。1

彼女いない歴 = 年齢

これをC言語で書くとこうなります。

kanojo.c
#include <stdio.h>
int main(void) {
  int nenrei = 21;
  int kanojo_inai_reki = 21;
  if (kanojo_inai_reki == nenrei) {
    printf(":)\n");
  } else {
    printf(":(\n");
  }
  return 0;
}
実行結果
:)

人間たるもの、年を取ることからは逃れられません。
年を取ったことにしましょう。

kanojo.c
#include <stdio.h>
int main(void) {
  int nenrei = 21;
  int kanojo_inai_reki = 21;
  if (kanojo_inai_reki == nenrei) {
    printf(":)\n");
  } else {
    printf(":(\n");
  }
  nenrei += 1;
  printf("年齢が上がった!\n");
  if (kanojo_inai_reki == nenrei) {
    printf(":)\n");
  } else {
    printf(":(\n");
  }
  return 0;
}
実行結果
:)
年齢が上がった!
:(

おかしいですね、公式が崩れてしまいました。

それは当たり前で、nenreikanojo_inai_rekiの2つの変数ははじめは同じ21という値を代入しているものの、年齢が上がってしまったのでnenreiだけ22になってしまい、その結果公式が崩れてしまったのです。

解決策としては、年齢が上がると同時にkanojo_inai_reki変数もインクリメントすればいいですが、わざわざそんな悲しいことはしたくありません。

そこでポインタを使用します。

ポインタに関しては深すぎてここでは語れないので、とりあえずWikipediaのリンクだけおいておきます。

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

さて、先程の年齢が上がる例をポインタを使用して書き換えてみましょう!

kanojo.c
#include <stdio.h>
int main(void) {
  int nenrei = 21;
  int *kanojo_inai_reki = &nenrei;
  if (*kanojo_inai_reki == nenrei) {
    printf(":)\n");
  } else {
    printf(":(\n");
  }
  nenrei += 1;
  printf("年齢が上がった!\n");
  if (*kanojo_inai_reki == nenrei) {
    printf(":)\n");
  } else {
    printf(":(\n");
  }
  return 0;
}
実行結果
:)
年齢が上がった!
:)

インクリメントをしたのはnenreiだけですが、kanojo_inai_rekiから得られる数値も変化しました。

kanojo_inai_rekiはポインタであり、そのポインタはnenrei変数を参照しています。なので、nenreiが変化したとしても自動的にkanojo_inai_rekiも値が変化したように見えたわけですね!

これで公式の崩壊は未然に防がれました!

めでたしめでたし


  1. 諸説あります