У вас есть массив массивов. 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
.