这关系到二维数组的管理问题,系统在定义二维数组时,需要知道这个数组第2维的尺寸,在你的例子中就是3,这样系统在顺序申请内存空间存储例子中的数据时,还是按照1,2,3,...,12这个顺序存放,但是系统要记住,这个数组的起始地址,可以表示为标号a,数组中第1列的3个数据1,2,3的起始地址a[0],第2列的3个数的起始地址a[1],...。所以你在输出cout< 例子中只定义了4行数据,也就是a[0]~a[3]的数据是这个数组的,超过了范围就是其他数据了,但仍然可以类推计算地址,所以cout<
个人认为, 这样写法本身就是不严格的.
除了 a[0], a[1], a[2], a[3] 之外, 其它都是未定义行为.
那为什么输出的是地址呢?
因为a是二维数组, a[0] 指的是a第一行的地址, 而不是第一行第一列的那个数.
当然, 如果 你确定想通过这种线性的方式访问数组中的元素, 那你必须要显式 类型转换
*((int *)a + 8) 就是输出的第9个元素.