如何在 C++ 中檢查指標是否為空指標

Jinku Hu 2023年1月30日 2020年11月24日
  1. nullptr 比較來檢查 C++ 中指標是否為空指標
  2. 在 C++ 中使用與 0 比較來檢查指標是否為空指標
  3. 在 C++ 中使用指標值作為條件來檢查指標是否為空指標
如何在 C++ 中檢查指標是否為空指標

本文將演示關於如何在 C++ 中檢查指標是否為空指標的多種方法。

nullptr 比較來檢查 C++ 中指標是否為空指標

C++ 語言提供了多種直接操作記憶體的低階函式,並規定了指標的概念,即指向記憶體地址的物件。通常情況下,指標應該指向某個被執行程式利用的物件。雖然,我們也可以將指標宣告為不指向任何物件的空指標。

一個空指標是通過分配字面的 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 的預處理變數,它的根基在 C 標準庫中,並且經常在舊版程式碼使用。請注意,在當代 C++ 程式設計中不建議使用 NULL,因為它相當於用整數 0 初始化,可能會出現上一節所說的問題。不過,我們還是可以通過比較指標與 0 來檢查指標是否為空指標,如下面的程式碼示例中演示。

#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++ 中使用指標值作為條件來檢查指標是否為空指標

當空指標用於邏輯表示式時,它們被判斷為 false。因此,可以在 if 語句條件中傳入一個給定的指標,以檢查它是否是空指標。請注意,取消引用空指標會導致未定義的行為,在大多數情況下會導致程式異常終止。

#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!
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Pointer