落穂拾い(これまでに出た質問とか)

1月13日辺り 授業内容

NULLとnullptrの違いが判らない

nullptrは、C++のバージョン11から導入された新しい予約語です。
その前はどこも指さないポインタとしては、NULLが使われていました。
 

古の掟(イニシエノオキテ)

古の時代のC言語ではNULLはどっかのヘッダファイルで以下のように宣言されていました。

#define NULL 0
または
#define NULL (void*)0
値としては結局0なんだよねぇ、これ

ポインタとは、アドレスを格納するための変数です。
そして、NULLポインタとは、どこも指さない事を明示的に示すことができるポインタです(`・ω・´)キリッ とかいう人いましたが、嘘でした。どう考えてもただ値として0が入ってるだけです。
(ただし、0番地はたいていNULLとしてきめられているので書き込みできないことにしてるはずなのであながち矛盾してはいない)

新しい理(アタラシイコトワリ)

近年になり、C++とかいうモダンでアニュイでキッチュな言語が流行ってきました。
その中では、恐ろしいことに、先人たちが積み上げてきたC言語の掟を多数破る理が綴られています。
そのうちの一つが、オーバーロード(オーバーロードについては、もう説明しなくてもいいよね)
オーバーロードは、

な機能です。
つまりこのような関数が宣言できます。

void func(int x);
void func(char *p);

この時に、呼び出し時に

char *p=NULL;
func(p);

のような呼び出しをすると、イニシエノオキテでは、NULL(=0)なので、整数で0の値が引数に指定されたとき、
コンパイラはどっちの関数を呼んだら良いかわからなくなってしまいます。
このような仕様の追加に伴い、本当の意味でなにも指さないよというポインタを表すモノが必要になってしまいました。

このようにして生み出されたのが新しい理である、nullptrです。
nullptrを用いることで、先ほどの関数は、

char *p=nullptr;
func(p);

このように書くことができ、ポインタを引数にとる関数を呼べばいいんだな、ということをコンパイラに知らせることができ、
無事引数による呼びわけを成功させることができます。

NULLとnullptrの違いが判らない 完