已知
int a[3][4],int *p。下列敘述正確的是?A. p 可以指向一維數組和一個變量
B. p 只能指向一維數組
C. p 只能指向一個變量
D. p 不能指向 a[1]
| 概念 | 類型 | 可賦值給 int *p? | 理由 |
|---|---|---|---|
| 整型變量 | int x | ✅ 是 | p = &x; 取地址類型匹配 |
| 一維數組 | int arr[4] | ✅ 是 | 數組名退化為指向首元素的指針 int* |
| 二維數組的一行 | a[1] (類型 int[4]) | ✅ 是 | a[1] 退化為 int*,指向第 1 行首元素 |
| 二維數組整體 | a (類型 int[3][4]) | ❌ 否 | &a 類型為 int(*)[4] (指向數組的指針),非 int* |
| 二維數組首行首元素 | &a[0][0] | ✅ 是 | 類型 int* |
#include <stdio.h>
int main() {
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *p;
int x = 99;
p = &x; // 指向單個變量 ✅
printf("p=&x: %d\n", *p);
p = a[1]; // 指向二維數組第 1 行 (一維數組) ✅
printf("p=a[1]: %d %d %d %d\n", p[0], p[1], p[2], p[3]); // 輸出 5 6 7 8
// p = a; // ❌ 編譯警告/錯誤: assignment from incompatible pointer type
// 正確寫法: int (*q)[4] = a; // 指向含 4 個 int 的數組的指針
return 0;
}
int arr[N] → 表達式中 (除 sizeof、&、字符串字面量初始化) **退化為 int***,指向 arr[0]。int a[M][N]:
a 退化為 int(*)[N] (指向「含 N 個 int 的數組」的指針)。a[i] 退化為 int* (指向第 i 行首元素)。&a 類型 int(*)[M][N] (指向整個二維數組)。int *p 可以指向**單個 int 變量**或**任何 int 類型的一維數組首元素** (包括二維數組的某一行)。選項 A 「p 可以指向一維數組和一個變量」準確涵蓋這兩種合法情況,為正確答案。