已知:
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*p)[4] = a;则表达式 *(*(p + 2) + 1) 的值为( )。
答案B。指针变量存储的是内存地址。定义指针时必须指定指向的类型(如int*指向int)。nullptr表示空指针。
指针必须先初始化再使用。nullptr是空指针常量,不指向任何有效内存。解引用空指针导致崩溃。
【考点】指针与数组|解引用运算|运算符优先级
1. 🎯 考纲定位 本题考查 GESP 二级 指针与数组模块。命题人专门用这道题卡住那些只背"指针加减"规则、却不会把指针和数组对应关系理解透的考生——很多人看到 p+2 就下意识想"第 2 行",完全忽略了 p 本身是指向行的指针。
2. 🧠 解题思维 看到二维数组 a[3][4],先建立核心对应关系:数组名 a 是行指针,类型 int(*)[4],指向第一行;p = a 后,p 也是行指针。p+2 就是第 3 行(a[2]),*(p+2) 解引用得到该行数组,再 +1 是数组元素偏移,最后 * 解引用得到具体值 a[2][1] = 10。
3. 🪤 陷阱拆解
4. 🔄 反命题思维 若改成 int* p = a,p 就指向第一个元素 a[0][0],p+2 跳到 a[0][2],再 +1 是 a[0][3]=4,答案全变。提醒:指针类型决定其加减规则,二维数组指针和一级指针不一样。