C 語言函數參數可以使用陣列語法,但編譯器會將其隱式轉換為指標。以下三種宣告等價:
void func(int arr[]);
void func(int arr[10]); // 大小被忽略
void func(int *arr); // 實際型別
sizeof(arr) 回傳指標大小而非陣列總大小。arr = NULL 錯誤),指標可重新指向。void func(int a[][COL]) 僅第一維退化為指標,第二維需為常數。| 場景 | 建議寫法 | 理由 |
|---|---|---|
| 單維陣列唯讀 | const int *arr 或 const int arr[] | 語意明確,防止意外修改 |
| 需修改內容 | int *arr + size_t len | 配合長度參數避免越界 |
| 二維陣列 | int (*arr)[COL] 或 int arr[][COL] | 保留行步長資訊 |
| 動態大小 | int **arr + 雙重指標配置 | 適合執行期決定維度 |
int getmax(const int *nums, size_t n) {
int max = nums[0];
for (size_t i = 1; i < n; ++i)
if (nums[i] > max) max = nums[i];
return max;
}
// 呼叫端
int data[] = {3, 1, 4, 1, 5};
int m = getmax(data, sizeof(data)/sizeof(data[0]));
函數參數使用「陣列語法」實為「指標語法」的語法糖。開發者應明確傳遞長度、善用 const、理解多維陣列退化規則,才能撰寫安全高效的 C 程式碼。