下面二维数组在内存中按行优先连续存储,因此 *(*(a + 1) + 0) 的值为 5 。
int a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};看到题先想内存布局:二维数组按行优先存储,a 是指向第一行的指针,a+1 指向第二行,*(a+1) 取第二行首元素,再 +0 仍是该元素,最后解引用得值。
易错点在于混淆 a 与 a[0] 的语义:a 是指向第一行的指针,a+1 指向第二行,*(a+1) 取第二行首元素,再 +0 仍是该元素,最后解引用得值。
本题考查 C++ 指针运算与二维数组内存布局,属于 GESP 四级 C++ 语言模块核心考点。命题人在此处设置题目的意图非常明确:四级考生普遍能写出二维数组声明,但一到指针运算就露怯。*(*(a + 1) + 0) 这种嵌套解引用是经典陷阱,卡住 70% 以上考生,因为需要同时理解"数组名即指针"、"指针运算规则"、"解引用语义"三层知识。
看到 int a[2][4] 先建立内存模型:二维数组在内存中按行优先连续存储,a 本身是指向第一行首元素的指针。a + 1 按指针算术规则向后移动一行,指向第二行首元素。*(a + 1) 解引用得到第二行第一个 int 值(5)。*(a + 1) + 0 仍是该值。最外层 *(*(a + 1) + 0) 对 int 值解引用?等等——这里其实是考察表达式求值顺序:*(a + 1) 是 int 类型,+ 0 仍是 int,再解引用?不对,重新审视:a 是 int(*)[4] 类型,a + 1 仍是 int(*)[4],*(a + 1) 是 int*,*(a + 1) + 0 是 int* 加 0 仍是 int*,再解引用得 int 值 5。命题人用看似复杂的嵌套表达式,实则只考"指针运算 + 解引用"这一条链。