CとC++でNULLポインターの定義が異なるのはなぜですか?
NULLポインターの定義方法は、CとC++では微妙に異なります。その理由と、それぞれの言語における正しい定義方法を詳しく解説します。
C++におけるNULLポインターの定義
C++では、NULLポインター定数は「値が0の整数定数式」として定義されます。つまり、以下のように記述できます。
int* p = 0;
なお、C言語で有効な「(void*)0」というキャスト形式は、C++では標準のNULLポインター定数として認められていません。これは、C++ではvoid*から他のポインター型への暗黙的な変換が許可されていないためです。
C言語におけるNULLポインターの定義
一方、C言語ではNULLポインター定数は「値が0の整数定数式」、または「その式をvoid*型にキャストしたもの」として定義されます。したがって、以下のいずれの書き方も有効です。
int* p = 0;
または
int* p = (void*)0;
C++11以降の「nullptr」キーワード
C++11では、NULLポインターをより明確に表現するための専用キーワード「nullptr」が導入されました。従来の0やNULLと異なり、nullptrはポインター型として厳密に扱われるため、オーバーロード解決の曖昧さなどの問題を回避できます。
int* ptr = nullptr;
C言語での実装例
以下は、C言語でポインターをNULLで初期化する例です。
#include <stdio.h>
int main() {
int *p = NULL; // ポインターをNULLで初期化
printf("The value of pointer is %u", p);
return 0;
}
出力結果
The value of pointer is 0.
C++での実装例
同様に、C++でポインターをNULLで初期化する例を以下に示します。
#include <iostream>
using namespace std;
int main() {
int *p = NULL; // ポインターをNULLで初期化
cout << "The value of pointer is ";
cout << p;
return 0;
}
出力結果
The value of pointer is 0.
まとめ
CとC++のNULLポインター定義の違いは、主に型システムの厳格さの違いに起因します。C++ではvoid*からの暗黙的変換が禁止されているため、C++11以降は型安全なnullptrを使用することが推奨されています。
-
C言語のポインタとは?基本の使い方と9種類のポインタ演算を徹底解説
ポインタとはポインタ(pointer)とは、別の変数のアドレス、すなわちメモリ上の格納位置を直接指し示す値を持つ変数のことです。通常の変数や定数と同様に、ポインタも変数のアドレスを格納する前に必ず宣言しておく必要があります。まず、次の文を見てみましょう。int qty = 179;この変数はメモリ上で以下のように表現されます。ポインタは次のように宣言します。int *p;これは「p は別の int 型変数のアドレスを保持するポインタ変数である」という意味です。アドレス演算子(&)による初期化ポインタ変数は、アドレス演算子「&」を使って初期化します。int qty = 175;i
-
C#のポインターとは?基本概念からunsafeコードでの使い方まで解説
ポインターとは何かポインター(pointer)とは、別の変数が格納されているメモリ上のアドレス、つまりメモリ位置の直接的なアドレスを値として持つ変数のことです。通常の変数が「データそのもの」を保持するのに対し、ポインターは「データがどこにあるか」という場所の情報を保持します。ポインターの宣言方法ポインターの基本的な構文は次のとおりです。type *var-name;たとえば、double型へのポインターは以下のように宣言します。double *z; /* double型へのポインター */unsafe修飾子とアンマネージコードC#では、安全性を確保するために、ポインター変数はunsafe修飾子