void print(const int arr[], int count) {
for (size_t i = 0; i != count; ++i)
cout << arr[i] << endl;
}
int main() {
int i = 0;
int j[2] = {0, 1};
print(&i, 1); // ✅ 編譯通過,運行輸出 0
print(j, 2); // ✅ 正常輸出 0 1
}
C++ 規定:**函數參數聲明為數組類型 `T arr[]` 或 `T arr[N]`,實際調整為指針類型 `T* arr`**。
| 場景 | 風險 | 建議 |
|---|---|---|
| 傳遞單個對象地址 `&obj` | 調用者需確保 `count=1`,否則越界訪問未定義行為 | 優先用函數重載 `void print(const int& val)` 處理單值 |
| 傳遞動態數組 `new int[n]` | 需手動傳遞長度,易出錯 | 用 `std::vector |
| 傳遞標準容器 | 無法直接傳遞 `vector` (需 `.data()`) | 模板化 `template |
#include
#include
#include
void print(std::span data) { // 自動推導大小,攜帶邊界信息
for (int x : data) cout << x << ' ';
cout << '\n';
}
int main() {
int i = 42;
int arr[] = {1,2,3};
std::vector v = {4,5,6};
print({&i, 1}); // 隱式構造 span (指針+長度)
print(arr); // 數組隱式退化 (保留大小)
print(v); // vector 隱式轉換 (data()+size())
}
函數參數 `const int arr[]` **本質是 `const int*`**,接收 `&i` (單個對象地址) 合法且常用於「統一處理單值與數組」的舊式代碼。現代 C++ 推薦 **`std::span` (C++20)** 或 **模板容器引用**,自動管理大小、避免退化、類型安全。