コンテンツにスキップ

C言語/nullptr

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

nullptr は、C23 で新たにキーワードとして導入された、C++ からインスパイアされた言語機能です。これまで C 言語では、NULL を使ってポインタの「無効」な状態を示すのが一般的でしたが、nullptr はポインタ型専用のリテラルとして導入され、より安全で明確な方法でポインタの無効状態を扱えるようになりました。nullptr は C++11 以降に導入され、その利便性が認識され、C23 で C 言語にも正式に追加されました。

背景

[編集]

C 言語において、ポインタが「無効」であることを示すために使われていた NULL マクロにはいくつかの問題がありました。NULL は実際には 0 で定義されることが多いため、型安全性に欠け、誤って整数とポインタを混同する危険性がありました。また、NULL はポインタ専用ではなく、整数型 0 でもあり得るため、ポインタとして使う場合でも他の用途で使うことができてしまいました。このような問題を解消するために、C++では nullptr が導入され、ポインタ専用のリテラルとして動作します。

C23 では、この nullptr を C 言語にも採用し、ポインタ型専用のリテラルとしての利用を可能にしました。これにより、ポインタの無効状態をより安全に扱えるようになり、コードの可読性と型安全性が向上しました。

nullptr の特徴

[編集]
  • 型安全性nullptr はポインタ型専用のリテラルであるため、整数型や他の型と混同することはありません。これにより、型安全性が確保されます。
  • コンパイラによるチェックnullptr はポインタ専用であり、誤って整数に代入したりすることができないため、コンパイラによる型チェックが強化されます。
  • 可読性の向上nullptr はその意味が直感的であり、ポインタが無効であることを明確に示すため、NULL よりも可読性が向上します。

使用方法

[編集]

nullptr はポインタ型の無効状態を示すリテラルとして使用されます。NULL と違って、整数型 0 とは異なり、ポインタ型専用であるため、型安全性が確保されます。

例:nullptr を使った基本的なコード

[編集]
#include <stdio.h>
int main() {
    int *ptr = nullptr;  // nullptr を使ってポインタの無効状態を示す

    if (ptr == nullptr) {
        printf("Pointer is null.\n");
    }
    return 0;
}

上記のコードでは、ptrnullptr で初期化され、ポインタが無効な状態であることが明確に示されています。NULL とは異なり、nullptr はポインタ型専用であり、型安全が保障されているため、誤って整数型や他の型と混同することがありません。

nullptr と NULL の違い

[編集]

nullptrNULL はどちらもポインタの無効な状態を示しますが、その使用方法には明確な違いがあります。NULL はマクロであり、整数型 0 に置き換えられるため、型安全性に欠けることがありました。一方、nullptr はポインタ型専用のリテラルであり、型安全性を提供します。

特徴 nullptr NULL (C11 以前)
データ型 ポインタ型専用 整数型(0 として定義されることが多い)
用途 ポインタの無効状態を示す
型安全性 高い。ポインタ型にのみ使用可能 低い。整数型と混同することがある
可読性 直感的で意味が明確 0 の代わりとして使われることが多い

nullptr と型安全性

[編集]

nullptr は型安全性を保証します。具体的には、nullptr はポインタ型にのみ代入可能であり、他の型、たとえば整数型などに代入しようとするとコンパイルエラーが発生します。これにより、誤ってポインタではない型に nullptr を代入することを防ぎ、コードのバグを未然に防ぐことができます。

例:型安全性を示すコード

[編集]
#include <stdio.h>
int main() {
    int *ptr = nullptr;  // 正しい使い方
    int num = nullptr;    // コンパイルエラー!nullptr はポインタ型専用

    return 0;
}

このコードでは、nullptrint 型の変数 num に代入しようとすると、コンパイルエラーが発生します。これは、nullptr がポインタ型専用であり、他の型に使用できないことを示しています。

C23 の nullptr と C++ の nullptr

[編集]

C++ では、nullptr は C++11 で導入され、その後のバージョンでも引き続き使用されています。C23 で C 言語に導入された nullptr は、C++ における nullptr と同様に、ポインタ型専用の無効値として動作します。C++ の nullptr はコンストラクタやオーバーロードなど、より複雑な使い方が可能ですが、C 言語では主にポインタの無効状態を示す用途で使われます。

結論

[編集]

C23 で nullptr がキーワードとして導入されたことにより、C 言語でも型安全で可読性の高いポインタの無効状態の扱いが可能となりました。NULL の問題点を解消し、誤った型の代入を防ぐことで、C 言語におけるポインタ操作がより安全で直感的になりました。これにより、C 言語のプログラミングにおけるバグの発生リスクを低減し、より堅牢なコードを書くための強力なツールが提供されたと言えるでしょう。