無論宣告為 void f(int arr[])、void f(int arr[10])、void f(int* arr),**函式內 arr 型別均為 int***,接收的是呼叫端陣列的**首元素地址**。函式對陣列元素的修改**直接反映到原陣列**。
void reversal(int x[], int n) { // 等價 int* x
int m = (n - 1) / 2;
int temp;
for (int i = 0; i <= m; ++i) {
int j = n - 1 - i;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
int main() {
int a[10] = {0,1,2,3,4,5,6,7,8,9};
reversal(a, 10); // 傳遞 &a[0]
// a 變為 {9,8,7,6,5,4,3,2,1,0}
}
void reversal(int* x, int n) {
int* i = x;
int* p = x + (n - 1) / 2; // 中點
int* j = x + n - 1; // 尾端
int temp;
for (; i <= p; ++i, --j) {
temp = *i;
*i = *j;
*j = temp;
}
}
| 維度 | 陣列下標 x[i] | 指標運算 *(p+i) |
|---|---|---|
| 可讀性 | 直觀,符合數學慣例 | 需理解指標遞增語義 |
| 編譯器優化 | 現代編譯器生成相同機器碼 | 同左 |
| 邊界檢查 | 無內建(同指標) | 無內建 |
| 適用場景 | 隨機存取、固定步長 | 串流處理、未知長度、指標算術 |