C 語言中指標與陣列常被誤以為等價,實則「指標是指標,陣列是陣列,兩者本質不同」。為何常見 int *p = array; 這樣的代碼?本質只有一點:陣列名是指向首元素的常量指標——這是兩者唯一聯繫。
編譯器將 p[i] 解釋為 *(p + i),這純粹是指標運算。p[i] 只是語法糖,讓人類閱讀更舒適,對編譯器無意義差異。
void fun(int *array) {
printf(" sizeof(array)...%zu\n", sizeof(array)); // 輸出指標大小(4或8)
}
int main() {
int array[] = {1, 2, 3, 4, 5};
printf(" sizeof(array)...%zu\n", sizeof(array)); // 輸出 20 (5*4)
fun(array);
return 0;
}
結果揭示: 傳遞陣列實為傳遞首元素位址。原因有二:
1. 效率:複製整個陣列耗時耗空間
2. C 設計初期賦值僅限基本類型,陣列屬聚合類型
啟示: 傳遞陣列時必須同時傳遞大小,否則函數內無法知邊界,極易越界。函數簽名應設計為 void fun(int *array, int n)。即便寫成 void fun(int array[], int n) 或 void fun(int array[5], int n),參數仍被視為指標,長度資訊被編譯器忽略。
int main() {
int array[] = {1, 2};
printf(" array...%p\n", array); // 0031FCEC
printf(" &array...%p\n", &array); // 0031FCEC
printf(" &array+1...%p\n", &array+1); // 0031FCF4 (差值 8 = sizeof(array))
return 0;
}
結論:
array 類型:int *,指向首個 int&array 類型:int (*)[2],指向含 2 個 int 的陣列(陣列指標)array+1 增 4 位元組,&array+1 增 8 位元組需透徹理解 C 宣告語法(右左規則),後續章節將詳細講解。掌握此點對理解多維陣列、函數指標、複雜宣告至關重要。
int array[] 被視為指標array 是首元素指標,&array 是整個陣列指標,類型不同、步長不同