在 C++ 中,定义如下二维数组:int a[3][4];,数组 a 在内存中是按行优先连续存放的,即 a[0][0]、a[0][1]、a[0][2]、a[0][3] 在内存中是连续的。
答案A。二维数组在内存中按行优先连续存储。int array[5][3]中元素按array[0][0]到array[4][2]的顺序连续排列。
二维数组按行优先存储。计算偏移量先确定每行元素个数再乘行号+列号。
【考点】C++数组内存布局|行优先存储|GESP四级数据结构
命题人卡住的是考生对"多维数组底层存储机制"的认知盲区——很多初学者误以为数组只是"逻辑上的二维",却忘了C++编译器必须按"连续的内存块"存放,且行优先(row-major)是C/C++的默认行为。GESP四级数据结构模块明确要求掌握数组的一维/二维声明及内存连续性,这道题就是用来筛掉那些只背语法不过原理的人。
看到"二维数组"先锁定C++的存储规则——按行优先(row-major)连续存放。a[3][4]表示3行4列,第一行就是a[0][0]到a[0][3],它们在内存中确实是紧挨着的。只要记住"行优先=行连续",这类题直接选对。
错误选项B是典型的"偷换概念"陷阱——它利用"连续"一词制造模糊感。命题人故意不说"按行优先连续存放",只说"在内存中是按行优先连续存放的,即 a[0][0]、a[0][1]、a[0][2]、a[0][3] 在内存中是连续的"。如果你只背"数组是连续的",就会忽略"行优先"这个关键前提。C++默认按行优先,但如果你误以为C++和Fortran一样是列优先,就会选错。
若把定义改成int a[4][3];,答案立刻翻转——因为a[0][3]越界不存在;若改成"按列优先存放",题干描述就变成错误的。命题人想考"语言默认存储规则"还是"边界条件",一个条件变化就能彻底改变答案。