序文
通常、C/C++ コードを記述するときに、NULL ポインターを表すために NULL を使用する人や、NULL ポインターを表すために nullptr を使用する人がいます。これらがすべて NULL ポインターであるかどうか知りたいと思うかもしれません。NULL ポインタを記述する方法が 2 つあるのはなぜですか? 以下では、この背後にある原理を理解していきます。
NULL が C 言語の null ポインタであることは誰もが知っています。C++ は、ほとんどの条件下で C と互換性があります。C++98 および以前の null ポインタも NULL で表されますが、C++11 の新機能では、nullptr を使用します。ポインタの null 値を表し、NULL は 0 のみを表します。
C/C++ の Null ポインター NULL と nullptr
1. C/C++ における NULL の定義と実装
C 言語における NULL の定義は一般的に次のとおりです。
#define NULL (void*)0
しかし同時に、NULL を整数定数 0 として定義することもできます。
C++11 における NULL の定義は次のとおりです。
#ifndef NULL
#ifdef __cplusplus //如果是C++文件,那么都会有 __cplusplus 标志
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
このコードを翻訳すると、C 言語の場合、NULL は次のように定義されます。
#define NULL ((void *)0)
C++ では、NULL は次のように定義されます。
#define NULL 0
2. nullptr を導入するために C++11 を導入する理由
この質問に答えるために、まずコードの一部を見てみましょう
#include<iostream>
using namespace std;
void f(int)
{
cout << "f(int)" << endl;
}
void f(int*)
{
cout << "f(int*)" << endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
コードの 2 行目が C++98 標準に準拠している場合、通常の考え方では、f(0) には void f (int) と f(NULL) が入るはずであることがわかりました。 void f(int*) を入力する必要があるため、必要な結果は
f(int)
f(int*)
f(int*)をそれぞれ出力することです
。その理由は、C++98では整数または型なしのポインター (void ) 定数ですが、コンパイラーはデフォルトでこれを整数定数として扱います。ポインターとして使用したい場合は、 (void ) 0 にキャストする必要があります。
上記の問題を回避するために、C++11 ではポインタの null 値を表す nullptr キーワードが導入されました。NULL は 0 のみを意味します。
知らせ:
- nullptr を使用してポインターの null 値を表す場合、nullptr は C++11 で新しいキーワードとして導入されたため、ヘッダー ファイルをインクルードする必要はありません。
- C++11 では、sizeof(nullptr) と sizeof((void )0) は同じバイト数を占めます。*
- コードの堅牢性を向上させるために、後でポインターの null 値を表すときに nullptr を使用することをお勧めします。
比較