首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 利用空指標哨兵簡化陣列遍歷:消除迴圈計數器與邊界檢查

     編輯:關於C++

技巧核心:以 NULL 終結陣列

在指標陣列末尾放置 NULL(或 nullptr),遍歷時以 *ptr != NULL 為終止條件,**完全消除計數器變數、長度參數、邊界檢查**,減少堆疊使用與執行期開銷。

完整程式碼範例


#include 
#include 
using namespace std;

void PrintStrings(char* Array[]) {
    while (*Array != NULL) {
        cout << *Array++ << endl;
    }
}

int main() {
    // 陣列以 NULL 結尾
    char* Test[] = { "abc", "cde", "fgh", NULL };
    
    PrintStrings(Test);
    
    cin.get();
    return 0;
}

輸出結果

abc
cde
fgh

優勢分析

傳統 for 迴圈NULL 哨兵法
需傳遞長度或計算 sizeof陣列自帶終止資訊,無需額外參數
索引變數 i 佔用暫存器/堆疊無索引變數,僅指標運算
每次迴圈需邊界比較 i < n單一指標解參考比較 *p != NULL
函數簽名需 (T* arr, size_t n)函數簽名簡潔 (T** arr) 或 (T* arr[])
易發生 off-by-one 錯誤結構上不可能越界

適用場景與限制

  • ✅ **字串指標陣列**(char*[]、const char*[])
  • ✅ **物件指標陣列**(Base*[]、std::unique_ptr[])
  • ✅ **函數指標表**(命令表、狀態機跳轉表)
  • ❌ **基本型別陣列**(int[]、double[])— 無自然哨兵值
  • ❌ **需隨機存取** 或 **多次遍歷** 的場合
  • ❌ **陣列可能包含合法 NULL** 的語意場景

現代 C++ 替代方案


// C++11 範圍 for + initializer_list
void PrintStrings(initializer_list List) {
    for (auto s : List) cout << s << '\n';
}
PrintStrings({"abc", "cde", "fgh"});

// C++20 std::span (非擁有視圖)
void PrintStrings(span Arr) {
    for (auto s : Arr) cout << s << '\n';
}
char* Arr[] = {"abc", "cde", "fgh"};
PrintStrings(Arr);  // 隱含轉換,長度自動推導

// 標準容器
vector Vec = {"abc", "cde", "fgh"};
for (auto& s : Vec) cout << s << '\n';

經典應用:main 參數處理


int main(int argc, char* argv[]) {
    // argv[argc] 保證為 NULL (C++ 標準)
    for (char** p = argv + 1; *p != NULL; ++p) {
        ProcessArgument(*p);
    }
}

記憶體佈局視覺化

Test 陣列記憶體佈局:
+--------+--------+--------+--------+
| "abc"  | "cde"  | "fgh"  | NULL   |  ← 連續指標陣列
+--------+--------+--------+--------+
  ^                               ^
  Test[0]                         Test[3] (哨兵)

遍歷指標移動:
p = Test
while (*p) { ... ; ++p; }

總結

NULL 哨兵是 **C 風格 API 經典慣用法**,在嵌入式、系統程式、舊代碼庫中極常見。現代 C++ 專案優先使用 std::vector/std::span/範圍 for,但在**與 C API 互操作**、**極度效能敏感**、**極簡介面**場景下,哨兵法仍具優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved