C++ でポインタが NULL かどうかを調べる

胡金庫 2023年10月12日
  1. C++ でポインタが NULL であるかどうかを調べるために nullptr と比較する
  2. C++ でポインタが 0 との比較を使ってポインタが NULL であるかどうかを調べる
  3. C++ でポインタが NULL であるかどうかを調べる条件としてポインタの値を使用する
C++ でポインタが NULL かどうかを調べる

この記事では、C++ でポインタが NULL かどうかを調べる方法について複数の方法を紹介します。

C++ でポインタが NULL であるかどうかを調べるために nullptr と比較する

C++ 言語にはメモリを直接操作するための複数の低レベル機能があり、メモリアドレスを指すオブジェクトである pointer の概念が指定されています。通常、ポインタは実行中のプログラムが利用するオブジェクトを指すべきです。しかし、ポインタをオブジェクトを指していないヌルポインタとして宣言することもできます。

ヌルポインタは、リテラル nullptr の値を代入するか、整数 0 を代入することで初期化されます。ただし、最近の C++ では、オーバーロードされた関数を使用した場合に望ましくない結果を招く可能性があるため、ポインタの 0 初期化は避けることが推奨されています。次の例では、ポインタが nullptr と等しくないかどうかを調べ、条件が満たされていればそのポインタを操作することができます。

#include <iostream>

using std::cout;
using std::endl;

#define SIZE 123

int main() {
  char *arr = (char *)malloc(SIZE);

  if (arr != nullptr) {
    cout << "Valid pointer!" << endl;
  } else {
    cout << "NULL pointer!" << endl;
  }

  free(arr);
  return EXIT_SUCCESS;
}

出力:

Valid pointer!

C++ でポインタが 0 との比較を使ってポインタが NULL であるかどうかを調べる

また、NULL というプリプロセッサ変数もありますが、これは C 標準ライブラリにルーツを持ち、レガシーコードでよく使われています。現代の C++ プログラミングでは、NULL を使用することは推奨されていないことを覚えておいてほしい。それでも、次のコードサンプルで示すように、0 と比較することでポインタが NULL であるかどうかを確認することができます。

#include <iostream>

using std::cout;
using std::endl;

#define SIZE 123

int main() {
  char *arr = (char *)malloc(SIZE);

  if (arr != 0) {
    cout << "Valid pointer!" << endl;
  } else {
    cout << "NULL pointer!" << endl;
  }

  free(arr);
  return EXIT_SUCCESS;
}

出力:

Valid pointer!

C++ でポインタが NULL であるかどうかを調べる条件としてポインタの値を使用する

ヌルポインタは論理式の中で使われると false として評価されます。したがって、与えられたポインタを if 文の条件に入れて、それがヌルかどうかを調べることができます。NULL ポインタを参照すると未定義の動作になり、ほとんどの場合、プログラムが異常終了してしまうことに注意してください。

#include <iostream>

using std::cout;
using std::endl;

#define SIZE 123

int main() {
  char *arr = (char *)malloc(SIZE);

  if (arr) {
    cout << "Valid pointer!" << endl;
  } else {
    cout << "NULL pointer!" << endl;
  }

  free(arr);
  return EXIT_SUCCESS;
}

出力:

Valid pointer!
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Pointer