定義一個包含 10 個元素的整型數組,輸入 10 個整數,然後輸出所有元素。
#include <stdio.h>
int main(void) {
int a[10];
int i;
printf("請輸入 10 個整數:\n");
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
printf("數組元素:");
for (i = 0; i < 10; ++i) {
printf("%2d ", a[i]);
}
printf("\n");
return 0;
}
本質:a[i] 編譯器自動轉換為 *(a + i)。數組名 a 在表達式中退化為指向首元素的指針。
#include <stdio.h>
int main(void) {
int a[10];
int i;
printf("請輸入 10 個整數:\n");
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
printf("數組元素:");
for (i = 0; i < 10; ++i) {
printf("%2d ", *(a + i)); // 等價於 a[i]
}
printf("\n");
return 0;
}
關鍵點:a + i 的地址計算考慮類型大小,即 &a[0] + i * sizeof(int)。
#include <stdio.h>
int main(void) {
int a[10];
int i;
int *p;
printf("請輸入 10 個整數:\n");
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
printf("數組元素:");
for (p = a; p < a + 10; ++p) { // 指針比較與遞增
printf("%2d ", *p);
}
printf("\n");
return 0;
}
優勢:指針可任意移動、支持指針運算、作為函數參數傳遞時保留地址運算能力。
| 方面 | 下標法 | 指針算術 | 指針變量 |
|---|---|---|---|
| 可讀性 | 最高 | 中等 | 高 |
| 靈活性 | 固定模式 | 可計算任意偏移 | 可前進/後退/跳躍 |
| 函數傳參 | 退化為指針 | 同左 | 天然適配 |
| 邊界檢查 | 編譯器不檢查 | 同左 | 同左 |
| 適用場景 | 簡單遍歷 | 隨機訪問、矩陣運算 | 鏈表、動態內存、複雜遍歷 |
a[0] a[1] a[2] ... a[9] +----+----+----+-----+----+ | 12 | 45 | 78 | ... | 99 | +----+----+----+-----+----+ ^ a (首地址) p = a → *p = a[0] p = a + 1 → *p = a[1] ... p = a + 9 → *p = a[9] p = a + 10 → 越界(僅用於循環終止判斷)
scanf("%d", a+i) 正確;scanf("%d", *(a+i)) 錯誤(傳值而非地址)a 是常量指針,不能賦值(a = p 編譯錯誤)sizeof(a) 在定義作用域內返回整個數組大小(40 字節),傳入函數後退化為指針大小(4/8 字節)掌握三種遍歷方式並理解其底層等價性,是從 C 語言初學者進階的關鍵一步。