この記事は、カノジョできないエンジニア Advent Calendar 2016の19日目の記事です。
カノジョ「
java.lang.NullPointerException
at kanojo.inai.engneer.Main.main
カノジョとの対話形式にしようとしましたが、どうあがいてもぬるぽだったためこの記事にカノジョは登場しません。
また、上ではJavaですが、今回扱うのはC言語です。
カノジョできないエンジニアにとって以下の公式は成り立つと考えられます。1
彼女いない歴 = 年齢
これを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;
}
:)
人間たるもの、年を取ることからは逃れられません。
年を取ったことにしましょう。
#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;
}
:)
年齢が上がった!
:(
おかしいですね、公式が崩れてしまいました。
それは当たり前で、nenrei
とkanojo_inai_reki
の2つの変数ははじめは同じ21という値を代入しているものの、年齢が上がってしまったのでnenrei
だけ22になってしまい、その結果公式が崩れてしまったのです。
解決策としては、年齢が上がると同時にkanojo_inai_reki
変数もインクリメントすればいいですが、わざわざそんな悲しいことはしたくありません。
そこでポインタを使用します。
ポインタに関しては深すぎてここでは語れないので、とりあえずWikipediaのリンクだけおいておきます。
さて、先程の年齢が上がる例をポインタを使用して書き換えてみましょう!
#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
も値が変化したように見えたわけですね!
これで公式の崩壊は未然に防がれました!
めでたしめでたし
-
諸説あります ↩