某 C 語言考題:「若要對 a 進行合理的自增運算,則 a 應具有( )說明」,選項 D(int b[10], *a = b;)為標準答案,但選項 C(char (*a)[3];)同樣合法,僅是用法罕見。
int a[3][2]; — 數組名非左值,不可自增(a++ 編譯錯誤)。char *a[] = {"12","ab"}; — 指針數組,a 為數組名,同理不可自增。char (*a)[3]; — 指向含 3 個 char 的數組的指針。a 是指針變量,a++ 合法,步長為 sizeof(char[3]) = 3 字節。雖語法正確,但業務語義鮮見。int b[10], *a = b; — a 指向數組首元素,a++ 步長 4 字節,最符合「遍歷數組」直覺,故為最佳答案。char (*a)[3];
a = (char(*)[3])malloc(2 * sizeof(char[3]));
a++; // 合法,地址增加 3
printf("%p\n", (void*)a);
結論:C 語法合法但非典型用法,考試選「最合適」而非「合法」,D 為最佳。