你有一个数组数组。 array[1]
跟随array[0]
在内存中,因为数组是连续的。如果p == array[0]
,则p[1]
遵循p[0]
,因为数组是连续的。所以,你是对的:所有内存array
都是连续的。
在图片中,array
看起来像这样。
+-----------------+-----------------+
| [0] | [1] |
+-----------------+-----------------+
现在,让我们分解一下array[0]
,array[1]
它们分别看起来像这样:
+--------+--------+
| [0] | [1] |
+--------+--------+
所以,最终的图片是:
+--------+--------+--------+--------+
| [0][0] | [0][1] | [1][0] | [1][1] |
+--------+--------+--------+--------+
现在,问题是,你能以你现在的方式访问这个连续的内存吗?答案是,标准不保证。数组是连续的,但标准不允许按照您所做的方式进行索引。换句话说:
&array[0][0]+2 == &array[1][0]
, 但(&a[0][0] + 2) + 1
未定义而&a[1][0] + 1
有效。如果这看起来很奇怪,那就是,但是根据您从标准中发布的报价,您只能计算一个位于数组内部或最多超过数组的指针(不取消引用“过去”指针) .
在实践中,我怀疑这会在任何地方失败,但至少根据标准,您的代码由于未定义的行为而无效。
也请参阅此帖子comp.lang.c
。