1. 數組下標與類型
數組的索引從 0 開始。例如,一個包含 10 個元素的數組,其合法下標范圍為 0 到 9,而不是 1 到 10。為了表示下標,通常使用 size_t 類型,它是一種與機器相關的無符號整型,足夠大以存放內存中任意對象的大小。size_t 定義在頭文件 <cstddef>
中。
示例代碼:
#include <iostream>
#include <cstddef> // 定義 size_t
using std::cout;
using std::endl;int main() {int arr[10]; // 定義一個含有10個元素的數組// 輸出數組的合法索引范圍for (size_t i = 0; i < 10; ++i)cout << "Index " << i << endl;return 0;
}
2. 使用下標運算符訪問數組元素
數組的元素可以通過下標運算符 []
直接訪問。例如:
#include <iostream>
using std::cout;
using std::endl;int main() {int scores[11] = {}; // 定義一個含有11個無符號整型元素的數組,并將所有元素初始化為0// 例如,用于統計分數段:0~9, 10~19, …, 90~99, 100unsigned grade;while (std::cin >> grade) {if (grade <= 100)++scores[grade / 10]; // 計算分數段下標,并將對應計數值加1}// 輸出所有計數值for (auto cnt : scores)cout << cnt << " ";cout << endl;return 0;
}
在上述代碼中,scores
數組用于統計不同分數段的成績個數。例如,若輸入的成績為 42,則 42/10
得 4,于是將 scores[4] 加1。注意:數組的下標操作直接由 C++ 語言提供,程序員必須保證下標合法,否則將導致未定義行為。
3. 使用范圍 for 語句遍歷數組
與 vector 和 string 類似,遍歷數組最簡潔的方法是使用范圍 for 語句。由于數組的大小是類型的一部分,編譯器知道數組中包含多少個元素,因此可以自動遍歷所有元素:
#include <iostream>
using std::cout;
using std::endl;int main() {int scores[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用范圍 for 遍歷數組for (auto count : scores)cout << count << " ";cout << endl;return 0;
}
這個循環會依次輸出數組中每個元素的值。
4. 檢查下標的合法性
下標訪問是數組操作中最常見的方法,但使用時必須保證下標在合法范圍內。下標必須大于或等于 0 且小于數組大小。如果使用了越界的下標,編譯器不會報錯,但運行時會產生不可預測的行為,嚴重時會導致緩沖區溢出等安全問題。
例如:
#include <iostream>
using std::cout;
using std::endl;int main() {int arr[10] = {0};// 錯誤示例:訪問 arr[10] 超出范圍(合法索引是 0 到 9)// cout << arr[10] << endl; // 未定義行為return 0;
}
因此,訪問數組元素時一定要確保下標正確,必要時可將下標作為 size_t 類型,并在邏輯上嚴格檢查。
5. 小結
- 數組下標:數組索引從 0 開始,一個包含 n 個元素的數組的合法下標范圍為 0 到 n-1。
- size_t 類型:建議使用 size_t 表示數組索引,因為它是無符號類型且足夠大,定義在
<cstddef>
中。 - 下標運算符:使用
[]
可直接訪問數組中已存在的元素;請確保下標在合法范圍內,防止未定義行為。 - 范圍 for 語句:可以用范圍 for 語句遍歷數組,編譯器根據數組大小自動處理,不必人工控制循環計數。
- 檢查下標:程序員必須負責檢查下標是否合法,避免數組越界導致安全問題。
通過正確地訪問數組中的元素,你可以高效地操作固定大小的容器,同時在代碼中明確保證下標安全,避免緩沖區溢出等嚴重錯誤。
參考資料
- cppreference.com 關于內置數組和 size_t 的詳細說明
- 各大 C++ 編碼規范(如 Google C++ Style Guide)中對數組訪問的建議
希望這篇文章能幫助你全面了解數組元素的訪問方式和注意事項,從而在實際編程中更安全、有效地使用數組。